Arduino - Оптимизация существующего метода для перебора массива - PullRequest
1 голос
/ 23 января 2012

Есть ли более эффективный и чистый способ сделать то, что уже делает следующий метод?

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]);
  }

}

Это относится к существующему вопросу, на который я ответил.

Arduino - итерация по массиву C

1 Ответ

2 голосов
/ 24 января 2012

Не должно быть необходимости в локальной переменной массива arr. Если вы покончили с этим, вам следует одновременно сэкономить пространство временного стека и ускорить выполнение, исключив необходимость копирования данных.

void sendCode(const prog_uint16_t inArray[]) {
  unsigned int c;

  for (int i = 0; c = pgm_read_word(inArray++); i++) {
    if (i % 2 == 0) { // Even array elements are delays
      delayMicroseconds(c);
    } else {          // Odd array elements are pulse lengths
      pulseIR(c);
    }
  }
}

В этом коде предполагается, что максимальное целое число, хранящееся в int, больше, чем максимальный размер inArray (это кажется разумным, поскольку исходный код по существу делает то же самое предположение, используя int для nLimit) .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...