启用const数组的部分

启用const数组的部分,c,multidimensional-array,embedded,C,Multidimensional Array,Embedded,我有四个const char[][]数组,每个数组大约有50个元素,每个元素包含另外40个值,这些值将被发送到图形LCD,以绘制特定的字母、数字、符号 现在,问题是,我正在用非常有限的资源开发一个嵌入式系统。虽然这四个数组在我之前工作的项目中都很有用,我需要大部分字符,但现在我只需要5到10个字符 我可以从数组中删除我不需要的字符,但我希望有更好的方法来禁止这些字符写入RAM/FLASH 我正在考虑使用#ifdef和#endif。但是对每个元素这样做,代码就会变得混乱 还有别的办法吗 提前谢谢

我有四个
const char[][]
数组,每个数组大约有50个元素,每个元素包含另外40个值,这些值将被发送到图形LCD,以绘制特定的字母、数字、符号

现在,问题是,我正在用非常有限的资源开发一个嵌入式系统。虽然这四个数组在我之前工作的项目中都很有用,我需要大部分字符,但现在我只需要5到10个字符

我可以从数组中删除我不需要的字符,但我希望有更好的方法来禁止这些字符写入RAM/FLASH

我正在考虑使用
#ifdef
#endif
。但是对每个元素这样做,代码就会变得混乱

还有别的办法吗

提前谢谢

编辑:

现在,我有
#ifdef
#endif
用于更大的部件,如:

#define ARRAY1_BIG_LETTERS
#define ARRAY1_SMALL_LETTERS
#define ARRAY1_NUMBERS
#define ARRAY1_OTHER

#define ARRAY2_BIG_LETTERS
#define ARRAY2_SMALL_LETTERS
#define ARRAY2_NUMBERS
#define ARRAY2_OTHER

...
但是,我仍然需要对内容进行更精细的控制

EDIT2:

这是(较小)阵列之一:


我预先选择要使用的值。因此,这可能需要以某种方式使用预处理器来完成…

首先,我建议您创建结构列表。此外,您的显示器是8x8,但您只使用6x8(您的边框始终为0),如果您将第一个替换为简单的字符,则不必写注释“它实际上是什么字母”。还有一个技巧可以将“终止符”(或停止序列)添加到表中。然后您不必知道数组大小(我假设您正在循环数组以找到正确的字母)。因此:

而使用类似于:

int i = 0;
while (writing[i].ascii != 0) {
    // do stuff, add if or anything
    ++i;
}
这种改变需要改变显示功能,但节省的内存可能是值得的

这是一部分。 这就是他们之间的区别 常量字符str[]=“str”; 和 const char*pStr=“Str”; ?

尺寸

在运行时写入数据时,const char str[]在堆栈上分配,实际上是数组

const char*pStr在堆上分配,并且在运行时只向其写入指向数据的指针,数据位于应用程序的全局内存中

这是什么意思? onst char writing_8x8[][9]={…};正在分配大量内存。在嵌入式设备上,这可能是。。。好吧,假设我不推荐

怎么办? 您可以将所有大阵列拆分为较小的阵列

typedef struct _dsp_letter {
    const char ascii;
    const char pixels[6];
} dsp_letter_t;

#ifdef ADD_OTHER
const dsp_letter_t other[] = {
    {' ', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'-', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'.', { 0 , 96 , 96 , 0 , 0 , 0 } },
    {':', { 0 , 108 , 108 , 0 , 0 , 0 } },
    {'=', { 36 , 36 , 36 , 36 , 36 , 0 } },
    { 0 }
};
#endif ADD_OTHER

#ifdef ADD_SMALL
const dsp_letter_t small[] = {
    {'a', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'b', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'c', { 0 , 96 , 96 , 0 , 0 , 0 } },
    {'d', { 0 , 108 , 108 , 0 , 0 , 0 } },
    { 0 }
};
#endif ADD_SMALL
现在,您可以在编译时或运行时在一个位置获得所有这些文件

编译时(与您以前的编译时一样):

或运行时:

#define ADD_OTHER 1
#define ADD_SMALL 0

int size = ADD_OTHER + ADD_SMALL;
int i = 0;
dsp_letter_t **writting = (dsp_letter_t *writting(malloc)(size* sizeof (dsp_letter_t *writting));

#ifdef ADD_OTHER 
writting[i++] = other;
#endif

#ifdef ADD_SMALL 
writting[i++] = small;
#endif
你可以这样做:)


不幸的是,我不知道如何在不使用#ifdef。。。endif所有位置://

首先,我建议您创建结构列表。此外,您的显示器是8x8,但您只使用6x8(您的边框始终为0),如果您将第一个替换为简单的字符,则不必写注释“它实际上是什么字母”。还有一个技巧可以将“终止符”(或停止序列)添加到表中。然后您不必知道数组大小(我假设您正在循环数组以找到正确的字母)。因此:

而使用类似于:

int i = 0;
while (writing[i].ascii != 0) {
    // do stuff, add if or anything
    ++i;
}
这种改变需要改变显示功能,但节省的内存可能是值得的

这是一部分。 这就是他们之间的区别 常量字符str[]=“str”; 和 const char*pStr=“Str”; ?

尺寸

在运行时写入数据时,const char str[]在堆栈上分配,实际上是数组

const char*pStr在堆上分配,并且在运行时只向其写入指向数据的指针,数据位于应用程序的全局内存中

这是什么意思? onst char writing_8x8[][9]={…};正在分配大量内存。在嵌入式设备上,这可能是。。。好吧,假设我不推荐

怎么办? 您可以将所有大阵列拆分为较小的阵列

typedef struct _dsp_letter {
    const char ascii;
    const char pixels[6];
} dsp_letter_t;

#ifdef ADD_OTHER
const dsp_letter_t other[] = {
    {' ', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'-', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'.', { 0 , 96 , 96 , 0 , 0 , 0 } },
    {':', { 0 , 108 , 108 , 0 , 0 , 0 } },
    {'=', { 36 , 36 , 36 , 36 , 36 , 0 } },
    { 0 }
};
#endif ADD_OTHER

#ifdef ADD_SMALL
const dsp_letter_t small[] = {
    {'a', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'b', { 0 , 0 , 0 , 0 , 0 , 0 } },
    {'c', { 0 , 96 , 96 , 0 , 0 , 0 } },
    {'d', { 0 , 108 , 108 , 0 , 0 , 0 } },
    { 0 }
};
#endif ADD_SMALL
现在,您可以在编译时或运行时在一个位置获得所有这些文件

编译时(与您以前的编译时一样):

或运行时:

#define ADD_OTHER 1
#define ADD_SMALL 0

int size = ADD_OTHER + ADD_SMALL;
int i = 0;
dsp_letter_t **writting = (dsp_letter_t *writting(malloc)(size* sizeof (dsp_letter_t *writting));

#ifdef ADD_OTHER 
writting[i++] = other;
#endif

#ifdef ADD_SMALL 
writting[i++] = small;
#endif
你可以这样做:)


不幸的是,我不知道如何在不使用#ifdef。。。endifall over the place://

据我所知,在C语言中,所有字符串文本都存储在程序开始时的只读内存中。唯一的解决方法是使用字符文本。如果不知道
const char[]
的内容以及与LCD的对话方式,就很难找到解决方法。它真的是嵌入式系统吗?在大多数嵌入式系统中,常量变量存储在闪存中,而不是RAM中。在开始优化之前,了解这些阵列的最终位置非常重要。若它们最终变成闪存,而您需要更多的RAM,那个么摆弄阵列将解决不了任何问题。您可以选择是将其存储到程序内存还是RAM中。我只是在寻找一个预处理器技巧,类似于我所发布的,但具有更多“精细控制”的东西。据我所知,在C语言中,所有字符串文本在程序开始时都存储在只读内存中。唯一的解决方法是使用字符文本。如果不知道
const char[]
的内容以及与LCD的对话方式,就很难找到解决方法。它真的是嵌入式系统吗?在大多数嵌入式系统中,常量变量存储在闪存中,而不是RAM中。在开始优化之前,了解这些阵列的最终位置非常重要。若它们最终变成闪存,而您需要更多的RAM,那个么摆弄阵列将解决不了任何问题。您可以选择是将其存储到程序内存还是RAM中。我只是在寻找一个预处理器技巧,类似于我发布的东西,但有更多的“精细控制”
#define ADD_OTHER 1
#define ADD_SMALL 0

int size = ADD_OTHER + ADD_SMALL;
int i = 0;
dsp_letter_t **writting = (dsp_letter_t *writting(malloc)(size* sizeof (dsp_letter_t *writting));

#ifdef ADD_OTHER 
writting[i++] = other;
#endif

#ifdef ADD_SMALL 
writting[i++] = small;
#endif