2

LED の行を 1 つずつ点灯させる次のコードを作成しました。

int ledPins[] = {7,8,9,10,11,12,13};

void setup() {
  for (int i = 0; i < sizeof(ledPins); i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

void loop() {
  for (int i = 0; i < sizeof(ledPins); i++) {
    digitalWrite(i, HIGH);
    delay(1000);
    digitalWrite(i, LOW);
    delay(1000);
  }
}

上記は正常に動作します。ただし、for ループが完了した後、繰り返す前に長い遅延 (約 10 秒) があります。

なぜこれほど長い遅延が発生するのでしょうか。これは予想どおりですか、それとも私のコードの問題ですか?

4

2 に答える 2

4

この関数sizeof(array)は、メモリ内の配列のサイズをバイト単位で返します。sizeof(int)はおそらく 1 ではないため、予想よりも大きな値が得られます。

sizeof配列全体のサイズを取り、それを単一の要素のサイズで割ることにより、配列内の要素の数を決定するために使用できます。

したがって、この行:

for (int i = 0; i < sizeof(ledPins); i++) {

次のように書き換える必要があります。

for (int i = 0; i < sizeof(ledPins) / sizeof(int); i++) {

参照: http://en.wikipedia.org/wiki/Sizeof

于 2012-10-19T11:51:31.787 に答える
1

この場合、配列のサイズは固定されているため、これを行う方が簡単です。

#define NO_LEDS 7

int ledPins[NO_LEDS] = {7,8,9,10,11,12,13};

void setup() {
  for (int i = 0; i < NO_LEDS; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}

または、配列のサイズの計算を変数に移動して、それを使用します。

int ledPins[] = {7,8,9,10,11,12,13};
int noLeds;

void setup() {
  noLeds = sizeof(ledPins) / sizeof(int);

  for (int i = 0; i < noLeds; i++) {
    pinMode(ledPins[i], OUTPUT);
  }
}
于 2013-01-18T23:23:27.453 に答える