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 索引越界问题,错误的中断条件会导致未定义的行为:

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])or 模板来计算数组的大小(或者,等效地,使用它来查找数组的结尾),但如果您使用的是当前合理的编译器,它已经知道如何正确处理该作业它自己的:

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

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

于 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 回答