Передача массива ссылок на строки в конструктор класса

LexaArduinschik
Offline
Зарегистрирован: 25.10.2017
Добрый день!
Имеется массив ссылок на строки... необходимый для того чтобы хранить во 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);

 

 

Deamon
Offline
Зарегистрирован: 21.09.2017

видимо ты невнимательно читал про использование PROGMEM

про memcpy_P слышал?

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

LexaArduinschik пишет:

Имеется массив ссылок на строки... необходимый для того чтобы хранить во 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) {}
b707
Offline
Зарегистрирован: 26.05.2017

ЕвгенийП, все отлично компилируется и без приведения типов.  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) {}

 

Deamon
Offline
Зарегистрирован: 21.09.2017

так то работает, это ежу понятно.

я так понимаю человек желает съэкономить ОЗУ раз использует PROGMEM

b707
Offline
Зарегистрирован: 26.05.2017

Deamon пишет:

так то работает, это ежу понятно.

я так понимаю человек желает съэкономить ОЗУ раз использует PROGMEM

Вы невнимательны. Строки для экономии ОЗУ остались в PROGMEM  А массив ссылок занимает такие крохи, что никакого смысла класть его во флеш нет.

LexaArduinschik
Offline
Зарегистрирован: 25.10.2017

Добрый день! Да я действительно хотел разместить строки и ссылки на них во флешь память. Как я понимаю ссылки на каждую строку займет 2 байта минимум. в моем проекте 50 строк.

LexaArduinschik
Offline
Зарегистрирован: 25.10.2017

ЕвгенийП, спасибо Вам за замечания и код, это как раз то что мне нужно. Саписибо всем.

В моей программе я как раз буду брать необходимы строки из флешь памяти в буффер и выводить на дисплей. 
DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

я даже меню всегда во флэш пхаю 

 


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}
};



b707
Offline
Зарегистрирован: 26.05.2017

LexaArduinschik пишет:

Добрый день! Да я действительно хотел разместить строки и ссылки на них во флешь память. Как я понимаю ссылки на каждую строку займет 2 байта минимум. в моем проекте 50 строк.

ну если хотите, можете и таблицу ссылок разместить во флеше - остальной код не изменится.

LexaArduinschik пишет:

В моей программе я как раз буду брать необходимы строки из флешь памяти в буффер и выводить на дисплей. 

копировать в буфер необязательно