【问题标题】:C++ array of pointers to array on limited memory platform (arduino)有限内存平台(arduino)上指向数组的C++指针数组
【发布时间】:2012-02-26 14:47:43
【问题描述】:

对于字母表中的每个字母,我都有一个这样声明的 int 数组:

int const  A[64] ={ 
    0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,
    0,1,1,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,1,1,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,1,0,1,0,0,0,0,
    0,0,0,0,0,0,0,0
};

然后我用指向这些的指针创建另一个数组。

int const * text[] = { A, B, C };

这可以正常工作,直到该文本数组达到一定数量的不同条目。

例如这有效:

int const * text[] = { A, A, A, A, A, A, A, A }; // could even go on much longer

但这会崩溃:

int const * text[] = { A, B, C, D }; // it seems the number of different entries matters

这是为什么呢?我认为如果它是指针,那么它所指向的内容应该是不变的大小?

请注意,这是在内存非常有限的 arduino 平台上运行的。

【问题讨论】:

  • 您能否对所发生的崩溃添加更详细的说明?
  • 对不起,我不能,平台不会打印任何错误。程序只是运行或不运行。
  • 除了text 的初始化之外,您的数组是否被引用到其他任何地方?
  • @clamp:再一次,您需要一个调试策略,从您提供给我们的少量信息来看,在我看来应该有一个调试器可用。无论如何,你能比“一个 Arduino”更具体吗?您不使用调试器是否有特殊原因?
  • 如果内存真的那么紧,你可以使用 char 数组。而使用位图,每个字形只需 8 个字符。

标签: c++ embedded arduino


【解决方案1】:

我怀疑对具有相同元素的数组的查找正在优化;如果int const *text[]; 在头文件中声明并在单独的目标文件中编译(定义),您可能会看到同样的问题。链接器已尽其所能,但所有数据都可能与堆/堆栈空间重叠。

至少对于 avr-libc(使用 avr-gcc、avr-binutils),有宏或变量属性可以将此类常量数据放置在更大的只读程序空间(闪存 ROM)中.

【讨论】:

  • 所以你的意思是编译器/链接器正在优化未使用的字母?
  • @clamp - 是的,如果该符号从未被引用。如果编译器知道查找将返回“A”,它将在编译时折叠该常量;它不需要执行实际的查找。
猜你喜欢
  • 1970-01-01
  • 2015-12-10
  • 2017-08-25
  • 2010-10-25
  • 1970-01-01
  • 1970-01-01
  • 2013-04-19
  • 2012-05-02
相关资源
最近更新 更多