Arduino - 有效地迭代C数组

时间:2012-01-20 10:26:04

标签: arrays arduino

我有以下数组:

PROGMEM prog_uint16_t show_hide_info[] = { 4216, 8900, 4380, 580, 500, 600, 500, 580, 1620, 580, 500, 600, 500, 580, 500, 600, 480, 600, 500, 580, 1620, 580, 1620, 600, 500, 580, 1620, 580, 1620, 600, 1600, 600, 1620, 580, 1620, 600, 500, 580, 1620, 580, 500, 600, 1600, 600, 500, 580, 1620, 580, 500, 600, 1620, 580, 1620, 600, 480, 600, 1620, 580, 500, 600, 1600, 600, 500, 580, 1620, 580, 500, 600, 39300, 8860, 2160, 580, 0 };

我希望能够遍历这个数组并相应地执行以下方法:

pulseIR(4216);
delayMicroseconds(8900);
pulseIR(4380);
delayMicroseconds(580);
...

这是我到目前为止所做的,显然偏离轨道:

unsigned int* get(prog_uint16_t code[]) {
  unsigned int c;

  while ((c = pgm_read_word(code++))) {
    //pulseIR(c); ??
    //delayMicroseconds(c+1); ??
  }
}

不太确定我应该用c做什么,说实话。

由于睡眠不足,我不能在生活中理解PROGMEM上的以下文件:

http://arduino.cc/en/Reference/PROGMEM

3 个答案:

答案 0 :(得分:1)

首先,你需要一些简短的手来找到数组的结尾。如果它具有固定数量的值,那么编译器可以通过这种方式计算它以查找int16值的计数:

PROGMEM prog_uint16_t show_hide_info[] = { 4216, 8900, 4380, 580, ....etc
int arraySize = sizeof(show_hide_info) / sizeof(prog_uint16_t);

然后,如果你想让一个函数只通过你的数组一次,那么函数就可以这样声明:

void cycleThruArrayOnce(prog_uint16_t *pInArray, int nLimit) {
 for (int i=0;i<nLimit;i=i+2) {
   pulseIR(pgm_read_word(pInArray++));
   delayMicroseconds(pgm_read_word(pInArray+));
 }
}

可以通过这种方式从主程序中调用它:

cycleThruArrayOnce(show_hide_info, arraySize);

答案 1 :(得分:1)

我最终使用以下代码。我需要它做什么。不确定它是否是最有效的方式。我愿意接受任何建议,并且愿意接受我最后的答案。

void sendCode(prog_uint16_t inArray[], int nLimit) {

  unsigned int arr[nLimit];
  unsigned int c;
  int index = 0;

  while ((c = pgm_read_word(inArray++))) {
    arr[index] = c;
    index++;
  }

  for (int i = 0; i < nLimit; i=i+2) {
    delayMicroseconds(arr[i]);
    pulseIR(arr[i+1]);
  }

}

答案 2 :(得分:1)

这会有点快吗

    for (int i = 0; i < nLimit; i=i+2) {
    delayMicroseconds(arr[i]);
    pulseIR(arr[i+1]);
  }

如果

for (int i = 0; i < nLimit; i++) {
    delayMicroseconds(arr[i]);
    i++;
    pulseIR(arr[i]);
  }