我在硬件mikromedia for XMEGA上使用mikroC PRO for AVR编写应用程序。 我有不同的语言在TFT显示器上显示。 我必须在运行时切换语言。
这可以通过以下方式工作,例如德语和英语。
我有两种语言的指针数组:
char* deu_hilfe[] = {
"START = Startet die Messung",
"STOPP = Stoppt die Messung",
"SETUP = Aufruf des Setups",
};
char *eng_hilfe[] = {
"START = Start the measurement",
"STOPP = Stop the measurment",
"SETUP = Open the setup",
};
我定义了一个指向指针的指针:
char **sprache_hilfe;
然后我将指针分配给德语或英语数组:
sprache_hilfe = eng_hilfe;
sprache_hilfe = deu_hilfe;
并使用它:
TEXT_HI_HITXT_1.Caption = sprache_hilfe[SP_HILFE_ALG_BUTTON];
这很好用,但我的问题是,数组在RAM中,我的RAM现已满了。 所以我试着制作数组CONST。 但是当我将我的数组投射到指针时:
char **sprache_hilfe = (char*)eng_hilfe;
我在显示屏上看不到任何文字。 我觉得我的演员有些不对劲。 有没有人有更好的解决方案或知道我的代码有什么问题?
来自德国的问候 帕特里克
答案 0 :(得分:1)
要将数组和字符串移动到ROM中,我会将它们声明如下
const char * const deu_hilfe[] = {
"START = Startet die Messung",
"STOPP = Stoppt die Messung",
"SETUP = Aufruf des Setups",
};
const char * const eng_hilfe[] = {
"START = Start the measurement",
"STOPP = Stop the measurment",
"SETUP = Open the setup",
};
这些声明指定字符串为const
,指针数组也为const
。然后,您可以使用此代码
const char * const *sprache_hilfe;
sprache_hilfe = eng_hilfe;
printf( "%s\n", sprache_hilfe[1] );
sprache_hilfe = deu_hilfe;
printf( "%s\n", sprache_hilfe[1] );
如果仍然无法工作,那么您必须查看链接器的MAP输出,以查看链接器决定放置字符串和数组的位置。然后使用调试器查看这些内存地址,以验证字符串和数组是否已正确刻录到只读内存中。
答案 1 :(得分:0)
无论如何,字符串文字的实际字符最终都在flash中。在哪里可以节省RAM是两个数组,在32位控制器的情况下占用24个字节(2 * 3个指针)。因此,像这样插入const
限定符。在此之后,GCC已将数组移至.rodata
部分。
char *const deu_hilfe[] = {
"START = Startet die Messung",
"STOPP = Stoppt die Messung",
"SETUP = Aufruf des Setups",
};
char *const eng_hilfe[] = {
"START = Start the measurement",
"STOPP = Stop the measurment",
"SETUP = Open the setup",
};
您的原始代码现在可以正常运行,无需任何转换。你可能从编译器得到2个警告。海湾合作委员会抱怨:
warning: assignment discards ‘const’ qualifier from pointer target type
为避免这种情况,您可以在作业时进行演员表:
sprache_hilfe = (char**)eng_hilfe;
或者声明sprache_hilfe
仅指向const数组:
char *const *sprache_hilfe;
您原来的作业
sprache_hilfe = (char*)eng_hilfe;
是错误的,因为eng_hilfe
指向char指针,而不是chars。