【问题标题】:Dynamic Variable Name Building, Concatenate动态变量名称构建、连接
【发布时间】:2017-06-13 09:39:38
【问题描述】:

我的问题涉及如何使用 arduino 轻松访问大量变量的主题。我想知道是否有可能在循环中动态更改变量名。我的英语不是最好的,所以让我用我现在正在处理的代码来解释一下。

我有一台小型热敏打印机。打印方法来自adafruit热敏打印库

void Adafruit_Thermal::printBitmap(int w, int h, const uint8_t *bitmap, bool fromProgMem) {
  ...
}

我创建了一个如下所示的位图字体:

static const uint8_t PROGMEM Char_32[] {
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
}; // Char 032 ( )
static const uint8_t PROGMEM Char_33[] {
    0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00
}; // Char 033 (!)
... for each caracter

我喜欢在这个 for 循环中逐字打印:

for(j = 0; j <= messageLength - 1; j++){  // Go through each character in the message.
  int character = message[j];  // reads and stores the ASCII value of the current Character        
  printer.printBitmap(letter_width, letter_height, Char_XX);  // i like to print the specific character
}

通常我会采用一个二维数组并像这样打印:

static const uint8_t PROGMEM letter_data[][8] =
{
  {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}, // Char 032 ( )
  {0x00, 0x00, 0x2E, 0x00, 0x00, 0x00, 0x00, 0x00}, // Char 033 (!)
  {0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00} // Char 034 (")
}

for(j = 0; j <= messageLength - 1; j++){    //Go through each character in the message.
  int Character = message[j] - 32;    // first visible ASCIIcharacter '!' is number 33. reads and stores the ASCII value of the current Character we are dealing with and -32 so the char correspnds to our array.
  printer.printBitmap(letter_width, letter_height, letter_data[Character]);
}

但是,我的字母会比 8x8 像素大得多,而且我的数组也会变大。那么有没有可能解决这个问题?

【问题讨论】:

  • 变得太大是什么意思?内存不足了吗?
  • 您需要 3 个嵌套循环:位图行/消息中的字符/位图列。
  • 根据您的代码,听起来 "changeing variable names" 对您的问题的描述是错误的,您的问题更多地与尝试管理内存使用有关,尤其是在堆栈使用方面。
  • @user3853544 我的字母是 136x72px 所以对应的 aray 必须是 array[][1224] 并且编译器会抛出这个错误letters.h:7554: error: size of array is too large }; ^

标签: c++ variables arduino concatenation concat


【解决方案1】:

从您的描述看来,您遇到了内存使用问题。官方 Arduino 文档表明,低端 Arduino 板具有 31.5Kb of Flash Memory (32 - 0.5) 或 PROGMEM,如您的代码中标记的那样 - 在其他系统中高达 248Kb (256 - 8)。

根据您的评论,如果每个字符占用 1224 字节的内存(或 1.2Kb),您将在以前的系统中耗尽 25 个字符的限制(甚至不足以覆盖字母表,仅此而已!)后者有 202 个字符。

所以这确实取决于您正在构建的确切系统,但很明显,在您使用的字符大小上,即使在更大的系统中,您也会遇到问题(因为此内存容量将与其他类似大小的结构共享)。

所以,对您的问题的简短回答:您需要压缩数据。我的建议是缩小每个字母使用的数据量(可能将两个维度的大小减半),然后在运行时写入输出设备(即显示设备)时扩展它。

【讨论】:

  • 感谢您的评论。我也想过。目前我正在使用 256k 字节的 ATmega2560(其中 8k 用于引导加载程序)。我的字体有 101 个字符。我希望有足够的空间。如果字符未存储在 2D 数组中,则草图上传正常。所以你可能是对的:当数组的大小太大时,草图无法编译,因为内存将被共享。
  • 但我的问题是是否有一种解决方法而不创建较小的字体。它的工作量很大,最终分辨率不会那么好。在脚本语言中,通常可以连接变量名。或者也许有人可以想到其他解决方案。如果我可以将数组分成块,我会尝试。
  • 成功了。我将大数组分成四个较小的数组,并且草图上传正常。
  • 我首先认为它有效,因为草图编译和上传都很好。但我没有在我的代码中使用数组之一。如果我在我的程序中包含一个较小的部分数组,我会得到同样的错误。
  • @EEPROM 我注意到您的错误消息出现在第 7554 行。请记住,闪存也用于存储程序本身。我的计算是基于一个包含这些字母的程序,基本上什么都没有。如果您的程序很充实(而且看起来确实如此),那么您的空间将比您预期的要少。我假设您在实际使用数组之前没有看到错误的原因是您的编译器正在优化未使用的变量。
猜你喜欢
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2014-04-24
  • 2014-09-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多