2

我解决问题的第一种方法是尝试制作字典/哈希表,但有人告诉我这是个坏主意。我被送到了PROGMEM。现在我的问题是我正在使用触摸屏制作菜单系统。我需要每个按钮都以不同的语言可用,所以有一个存储当前语言的内存位置,0 - 英语,1 - 西班牙语,2 - 法语。当我打开系统时,它会将这个值读入一个名为lang.

我希望我的代码像这样工作(其中 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 个字符,我不确定我是否有点搞砸了我的指针。

那么,上面的问题是什么,我该如何解决呢?此外,我必须按照链接中显示的方式创建字典/字符串表,还是可以像上面那样做?(我上面的做法对我来说似乎更容易,因为我最终将拥有大约 40 个菜单屏幕和大量文本。)

4

1 回答 1

3

你不必使用`PROGMEM

好吧,你真的不使用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,但为什么不能在这一点上呢?

于 2013-04-01T04:40:18.897 回答