为什么下面的循环没有为pinMode
数组中的引脚设置OUTPUT
到pins[]
?
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);
// ...
答案 0 :(得分:2)
错误的中断条件会导致由于索引超出范围的问题导致的未定义行为:
for (int i = 0; i < sizeof(pins); i++)
^-----------^
应该是:
for (int i = 0; i < sizeof(pins)/sizeof(pins[0]); i++)
^---------------------------^
注意:将sizeof运算符应用于数组类型时,结果是数组中的总字节数。
答案 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);
至少在我看来,这似乎是三者中最简单的。