0

以下のループが配列内のピンに を設定pinModeしないのはなぜですか?OUTPUTpins[]

int pins[21];

void setup() {

    int pins[] = {13,
              3, 4, 5, 6, 7, 8, 9, 10, 11, 12,
              14, 15, 16, 17, 18, 19, 20, 21, 22, 23};

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

}

それを機能させるには、手動で設定する必要があります。

pinMode(3, OUTPUT);    
pinMode(4, OUTPUT);
pinMode(5, OUTPUT);
// ...
4

4 に答える 4

2

n index-out-of-bound の問題により、間違った分割条件により未定義の動作が発生します:

for (int i = 0; i < sizeof(pins); i++)
                    ^-----------^ 

次のようにする必要があります。

for (int i = 0; i < sizeof(pins)/sizeof(pins[0]); i++)
                    ^---------------------------^

注: sizeof 演算子を配列型に適用すると、結果は配列内の合計バイト数になります。

数式の読み取りを理解するには: C で配列を印刷するときの奇妙な動作?

于 2013-09-20T19:08:43.623 に答える
1

に変更sizeof(pins)sizeof pins / sizeof *pinsます。

sizeof配列の要素数ではなく、配列のサイズをバイト単位で返します。

于 2013-09-20T19:08:26.313 に答える
0

またはテンプレートを使用して配列のサイズを計算することはできますがsizeof(array)/sizeof(array[0])(または、同等に、それを使用して配列の末尾を見つけることもできます)、最新のコンパイラを使用している場合は、ジョブを正しく処理する方法を既に認識しています。独自の:

for (auto i : pins)
    pinMode(i, OUTPUT);

少なくとも私の意見では、これは 3 つの中で最も単純なように思えます。

于 2013-09-20T19:27:20.873 に答える
0

まず、は のエントリ数の倍になりsizeof(pins)ます。範囲外の値にアクセスすると、未定義の動作が発生します。あなたはおそらく使用するつもりでしたsizeof(int)pins

sizeof(pins)/sizeof(pins[0])

またはC ++ではsize(pins)、次のような適切な関数テンプレートを使用するだけです

template <typename T, std::size_t Size>
constexpr std::size_t size(T(&)[Size]) { return Size; }

関数が機能しない理由は、コードに関数 (またはマクロ) の定義が含まれていないため、提供したコード スニペットからはわかりませんpinMode()

于 2013-09-20T19:14:01.107 に答える