循环未正确设置值

Loop does not set value correctly

本文关键字:设置 循环      更新时间:2023-10-16

为什么下面的循环没有为数组pins[]中的引脚设置pinMode OUTPUT

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);
// ...

错误的中断条件导致由于 n 个索引越界问题而导致未定义的行为:

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

应该是:

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

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

要理解公式,请阅读:在 C 中打印数组时出现奇怪的行为?

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

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

对于初学者来说,sizeof(pins)将是pins条目数的sizeof(int)倍。访问范围之外的值会导致未定义的行为。您可能打算使用

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()

尽管您可以使用sizeof(array)/sizeof(array[0])或模板来计算数组的大小(或者,等效地使用它来查找数组的末尾),但如果您使用的是相当最新的编译器,它已经知道如何自己正确处理作业:

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

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