我解决问题的第一种方法是尝试制作字典/哈希表,但我被告知这是一个坏主意。我被发送到 PROGMEM 。现在我的问题是我正在使用触摸屏制作菜单系统。我需要每个按钮以不同的语言提供,因此有一个存储位置存储当前语言,0 - 英语,1 - 西班牙语,2 - 法语。当我打开系统时,它会将此值读入名为lang
的char / byte变量。
我希望我的代码能够像这样工作(其中LANG_SOUND是一个常量值7):
const char* dictionary[3][8] PROGMEM = {
{"Account", "Date and Time", "Idle", "Language", "Main Menu", "Prescription", "Settings", "Sound"},
{"Cuenta", "Fecha y Hora", "Espera", "Idioma", "Menú Principal", "Receta", "Configuración", "Sonido"},
{"Compte", "Date et heure", "Idle", "Langue", "Main Menu", "prescription", "Paramètres", "Son"}
};
strcpy_P(buffer, (char*) pgm_read_word (&(dictionary[lang][LANG_SOUND])));
screen.print(buffer, CENTER, 23);
上面提到的 PROGMEM 页面创建的字典略有不同。我现在的问题是上面的代码不起作用。可能是8不是8个字符串元素,而是每个字符串最多8个字符,我不确定我是否已经搞砸了我的指针。
那么,上面的问题是什么,我该如何解决?此外,我必须按链接中显示的方式创建字典/ string_table,还是可以按照上面的方式进行操作? (我上面的方式对我来说似乎更容易,因为我最终会有大约40个菜单屏幕和大量文本。)
答案 0 :(得分:3)
嗯,你真的不能使用PROGMEM
。如果您现在想避免麻烦,只需从PROGMEM
中删除dictionary
属性并使用以下内容:
screen.print(dictionary[lang][LANG_SOUND], CENTER, 23);
但是,如果您有很多这样的数据,则可能需要使用PROGMEM
。但是,如果您想立即开发应用程序的其他部分,请暂时忽略PROGMEM
部分。
PROGMEM
不幸的是,您必须使用PROGMEM
,就像在该示例中一样,即为每个PROGMEM
字符串声明一个唯一变量。您不必将表格存储在PROGMEM
中。但是像这样的行:
prog_char dictEnglishSalami[] PROGMEM = "Salami";
prog_char dictEnglishProsecco[] PROGMEM = "Prosecco";
将是必需的。 dictionary
表格看起来像
const char *string_table[] = {
dictEnglishSalami,
dictEnglishProsecco,
...
};
可以声明PROGMEM
或不声明,但为什么不在这一点?