Передача массива ссылок на строки в конструктор класса
- Войдите на сайт для отправки комментариев
Ср, 25/10/2017 - 14:19
Добрый день!
Имеется массив ссылок на строки... необходимый для того чтобы хранить во flash памяти
char string_1[] PROGMEM = "String 1";
char string_2[] PROGMEM = "String 2";
char string_3[] PROGMEM = "String 3";
char string_4[] PROGMEM = "String 4";
char string_5[] PROGMEM = "String 5";
const char* string_table[] PROGMEM ={string_1,string_2,string_3,string_4,string_5};Подскажите как передать ссылки на массив string_table в конструктор класса чтобы внутри класса была возможность получить доступ к этим строкам.
Пробовал множество вариантов, но работоспособного варианта не нашел.
Класс выглядит примерно так:
class test1{
public:
test1(char *strTab[]);
private:
char *_pStrTab;
};
test1::test(char *strTab[]){
_pStrTab = strTab;
};
test1 obj (string_table);
видимо ты невнимательно читал про использование PROGMEM
про memcpy_P слышал?
Имеется массив ссылок на строки... необходимый для того чтобы хранить во flash памяти
char string_1[] PROGMEM = "String 1"; char string_2[] PROGMEM = "String 2"; char string_3[] PROGMEM = "String 3"; char string_4[] PROGMEM = "String 4"; char string_5[] PROGMEM = "String 5"; const char* string_table[] PROGMEM ={string_1,string_2,string_3,string_4,string_5};Странно он (массив) у Вас описан. Неужели компилируется? Чем, интересно - что за IDE у Вас?
Я бы описал его так:
const char string_1[] PROGMEM = "String 1"; const char string_2[] PROGMEM = "String 2"; const char string_3[] PROGMEM = "String 3"; const char string_4[] PROGMEM = "String 4"; const char string_5[] PROGMEM = "String 5"; const char * const string_table[] PROGMEM ={string_1,string_2,string_3,string_4,string_5};А передавать конструктору, так Вы описывайте параметр конструктора как положено - а именно точно так, как описана переменная, которую Вы собраись передавать. И будет Вам счастье.
Вот это пример печатает "String4" - вполне правильно по-моему
const char string_1[] PROGMEM = "String 1"; const char string_2[] PROGMEM = "String 2"; const char string_3[] PROGMEM = "String 3"; const char string_4[] PROGMEM = "String 4"; const char string_5[] PROGMEM = "String 5"; const char * const string_table[] PROGMEM ={string_1,string_2,string_3,string_4,string_5}; class Kaka { public: Kaka(const char * const * s PROGMEM) { memcpy_P(buff, s[3], 9); } char buff[20]; } kaka(string_table); void setup(void) { Serial.begin(115200); Serial.println(kaka.buff); } void loop(void) {}ЕвгенийП, все отлично компилируется и без приведения типов. IDE 1.6.12
И вообще мне кажется ваш код излишне сложным. В этом конструкторе указывать PROGMEM незачем, работает и так. Копировать строку в буфер, для того чтоб напечатать - зачем? Печатайте напрямую, в классе Serial есть готовый метод для строк во флеше.
const char string_1[] PROGMEM = "String 1"; const char string_2[] PROGMEM = "String 2"; const char string_3[] PROGMEM = "String 3"; const char string_4[] PROGMEM = "String 4"; const char string_5[] PROGMEM = "String 5"; char * string_table[] ={string_1,string_2,string_3,string_4,string_5}; class Kaka { public: Kaka( char * s ) { buff = s[3]; } char* buff; } kaka(string_table); void setup(void) { Serial.begin(115200); Serial.println((const __FlashStringHelper *) kaka.buff); } void loop(void) {}так то работает, это ежу понятно.
я так понимаю человек желает съэкономить ОЗУ раз использует PROGMEM
так то работает, это ежу понятно.
я так понимаю человек желает съэкономить ОЗУ раз использует PROGMEM
Вы невнимательны. Строки для экономии ОЗУ остались в PROGMEM А массив ссылок занимает такие крохи, что никакого смысла класть его во флеш нет.
Добрый день! Да я действительно хотел разместить строки и ссылки на них во флешь память. Как я понимаю ссылки на каждую строку займет 2 байта минимум. в моем проекте 50 строк.
ЕвгенийП, спасибо Вам за замечания и код, это как раз то что мне нужно. Саписибо всем.
я даже меню всегда во флэш пхаю
using PFlashString = __FlashStringHelper *; const char str_SetHour[] PROGMEM = "Set Hour: "; const char str_SetMinuts[] PROGMEM = "Set Minutes: "; const char str_ClearSeconds[] PROGMEM = "Clear Seconds:"; const TMenuItem ClockSubMenu[] PROGMEM = { {PFlashString(str_SetHour),mn_SetHour}, { PFlashString(str_SetMinuts),mn_SetMinutes }, { PFlashString(str_ClearSeconds),mn_ClearSeconds } }; . . . // Многапропущено . . const char str_Item1[] PROGMEM = "Set Clock "; const char str_Item2[] PROGMEM = "Set Date "; const char str_Item3[] PROGMEM = "Set Alarm "; const char str_Item4[] PROGMEM = "Set Values "; const char str_Item5[] PROGMEM = "Close "; const TMenuItem Items[] PROGMEM = { { PFlashString(str_Item1), mn_SetClock, ClockSubMenu }, // Вложенное меню ClockSubMenu { PFlashString(str_Item2), mn_SetDate, DateSubMenu}, { PFlashString(str_Item3), mn_SetAlarm, AlarmSubMenu}, { PFlashString(str_Item4), mn_SetValues,ValuesSubMenu}, { PFlashString(str_Item5), mn_Close, CloseMenu} };Добрый день! Да я действительно хотел разместить строки и ссылки на них во флешь память. Как я понимаю ссылки на каждую строку займет 2 байта минимум. в моем проекте 50 строк.
ну если хотите, можете и таблицу ссылок разместить во флеше - остальной код не изменится.
В моей программе я как раз буду брать необходимы строки из флешь памяти в буффер и выводить на дисплей.
копировать в буфер необязательно