Arduino数组取值编译报错:const char*转uint8_t无效,如何修复?
Arduino引脚控制编译错误修复方案
错误原因
digitalWrite()函数的第一个参数要求传入引脚的数字编号(uint8_t类型,即0-255的整数),但你当前传入的是"A_7"这类字符串(const char*类型),类型不匹配导致编译失败。
修复方法
方法1:直接使用整数数组存储引脚编号
这是最简洁的方案,把原来的字符串数组替换为存储对应引脚编号的整数数组:
// 替换原数组定义,注意把J_1、J_2替换为实际对应的引脚编号 const int DAY1[] = {7, 8, 9, 10, 1, 2, 3, 4, 5, 6, 11, 12}; // 示例编号,按需修改 const int DAY2[] = {7, 8, 10, 1, 4, 5, 11, 12}; // 示例编号,按需修改
循环代码无需大幅改动,直接使用数组元素即可:
for (byte i = 1; i < (sizeof(DAY1) / sizeof(DAY1[0])); i++) { if( timeClient.getDay() == 0 ){ digitalWrite(DAY1[i-1], LOW); delay(DELAY); digitalWrite(DAY1[i], HIGH); sprintf(statusBuf,"TEST = A_%d = %d = %ld", DAY1[i], i, ADelay.remaining() ); sendLog(statusBuf); } else if( timeClient.getDay() == 1 ){ digitalWrite(DAY2[i-1], LOW); delay(DELAY); digitalWrite(DAY2[i], HIGH); sprintf(statusBuf,"TEST = A_%d = %d = %ld", DAY2[i], i, ADelay.remaining() ); sendLog(statusBuf); } }
方法2:用结构体同时保留引脚名称和编号(适合需要日志显示名称的场景)
如果需要在日志中保留"A_7"这类标识,可定义结构体数组同时存储名称和引脚编号:
// 定义结构体,包含引脚名称和对应编号 struct PinItem { const char* name; int pin; }; // 初始化结构体数组,替换J_1、J_2的实际引脚编号 const PinItem DAY1[] = { {"A_7", 7}, {"A_8", 8}, {"A_9", 9}, {"A_10", 10}, {"A_1", 1}, {"A_2", 2}, {"A_3", 3}, {"A_4", 4}, {"A_5", 5}, {"A_6", 6}, {"J_1", 11}, {"J_2", 12} }; const PinItem DAY2[] = { {"A_7", 7}, {"A_8", 8}, {"A_10", 10}, {"A_1", 1}, {"A_4", 4}, {"A_5", 5}, {"J_1", 11}, {"J_2", 12} };
循环中通过结构体的.pin字段调用digitalWrite,.name字段用于日志输出:
for (byte i = 1; i < (sizeof(DAY1) / sizeof(DAY1[0])); i++) { if( timeClient.getDay() == 0 ){ digitalWrite(DAY1[i-1].pin, LOW); delay(DELAY); digitalWrite(DAY1[i].pin, HIGH); sprintf(statusBuf,"TEST = %s = %d = %ld", DAY1[i].name, i, ADelay.remaining() ); sendLog(statusBuf); } else if( timeClient.getDay() == 1 ){ digitalWrite(DAY2[i-1].pin, LOW); delay(DELAY); digitalWrite(DAY2[i].pin, HIGH); sprintf(statusBuf,"TEST = %s = %d = %ld", DAY2[i].name, i, ADelay.remaining() ); sendLog(statusBuf); } }
额外注意点
原代码中定义的buf=50远大于实际数组元素数量,循环会遍历到未初始化的空元素,可能引发运行时错误。上述两种方案均使用sizeof(数组)/sizeof(数组[0])自动计算有效元素数量,避免了这个问题。
内容的提问来源于stack exchange,提问作者wieb
相关产品推荐
相关产品推荐

