循环未正确设置值

时间:2013-09-20 19:07:11

标签: c++ c arduino

为什么下面的循环没有为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 个答案:

答案 0 :(得分:2)

错误的中断条件会导致由于索引超出范围的问题导致的未定义行为:

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

应该是:

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

注意:将sizeof运算符应用于数组类型时,结果是数组中的总字节数。

要理解公式读数:Weird behavior when printing array in C?

答案 1 :(得分:1)

sizeof(pins)更改为sizeof pins / sizeof *pins

sizeof以字节为单位生成数组的大小,而不是数组的元素数。

答案 2 :(得分: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()的定义,因此无法从您提供的代码段中看到函数无法正常工作。

答案 3 :(得分:0)

虽然可以使用sizeof(array)/sizeof(array[0])或模板来计算数组的大小(或者,等效地,使用它来查找数组的末尾),但如果你&#39;使用合理的当前编译器,它已经知道如何正确处理作业:

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

至少在我看来,这似乎是三者中最简单的。