循环未正确设置值
Loop does not set value correctly
为什么下面的循环没有为数组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);
至少在我看来,这似乎是三者中最简单的。
相关文章:
- 具有Qt事件循环的可移植通用共享库设置
- 对于完成布尔值设置为 true 后未停止的循环
- 循环中的变量被设置为下一个数组的元素始终具有相同的内存地址?
- 是否可以为一个循环设置多个条件
- 循环 std::由索引设置
- 第二个 while 循环未运行,将值设置为 "nan"
- C++ if 语句将条件设置为 true 和循环中的 OR-ing 条件之间的行为差异
- while 循环是否在设置标志的情况下运行多次?
- 有没有办法在C++中将偏移量设置为基于范围的 for 循环?
- 循环以使用设置模板类将所有 26 个字母添加到 s 中
- 尝试在自定义 QT 创建器文本编辑器中创建查找和替换循环.我似乎无法设置光标位置
- 在循环中设置指向 int 值的指针
- 如何将布尔矩阵的每个元素设置为false而不循环
- 如何使用Boost Graph库使用循环中的循环设置相同的边缘重量
- 一个线程设置成员,而另一个循环上方 - 是此螺纹 - 不安全
- 如何在没有循环的字节中设置位
- 我如何将输入分配给在 for 循环中设置的映射功能
- 创建一个函数,该函数吸收数组并循环添加数组,并将第二个数组值设置为零
- 为什么 for 循环没有达到循环的第二个条件中设置的数字
- 使用 while / do-while 循环进行数组元素设置