指向CONST数组的字符串?

时间:2014-09-15 05:57:48

标签: c

我在硬件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;

我在显示屏上看不到任何文字。 我觉得我的演员有些不对劲。 有没有人有更好的解决方案或知道我的代码有什么问题?

来自德国的问候 帕特里克

2 个答案:

答案 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。