You need to enable JavaScript to run this app. Arduino红外遥控器char[int]数组下标无效编译错误如何修复?
优惠活动
大模型
产品
解决方案
定价
更多

Arduino红外遥控器char[int]数组下标无效编译错误如何修复?

Arduino红外遥控器编译错误修复方案

已确认的错误点

  • 字符比较误用双引号:C/C++语法中,char类型单个字符需要用单引号包裹,你代码中key == "#"、array_choice == "A"等写法都是将char和字符串常量比较,属于语法错误,全部改为单引号即可,比如key == '#'、array_choice == 'A'。
  • 数组指针类型定义错误:int selected_array = A;的写法错误,数组名是指针类型,不能赋值给普通int变量,需要定义为指针类型:int* selected_array = A;;另外B数组对应的赋值写了双等号int selected_array == B;,属于把比较运算当成赋值,直接改为单等号即可。
  • 按键返回值未做类型转换:keypad.getKey()返回的是字符类型,比如按下数字0返回的是ASCII字符'0'(对应数值48),不是整数0,直接判断index_of_signal == 0永远不会成立,需要转换为整数:int signal_idx = index_of_signal - '0';。
  • 按键读取无等待逻辑:你在发送完两个RC5信号后直接调用keypad.getKey(),此时用户还没有完成按键操作,getKey会直接返回空值,后续逻辑都不会执行,需要加等待按键的逻辑:while( !(array_choice = keypad.getKey()) ); 阻塞等待用户按下数组选择键,索引选择同理。
  • 重复初始化串口:setup函数中两次调用Serial.begin(9600),属于冗余代码,删除一行即可。

替代实现方案

不需要写大量重复的A/B/C/D判断逻辑,直接用指针数组管理四个存储数组,代码可以精简80%:

  1. 定义指针数组关联四个存储数组:int* stored_arrays[] = {A, B, C, D};
  2. 按下A/B/C/D后直接对应数组索引0/1/2/3,比如按A对应stored_arrays[0],按B对应stored_arrays[1],不需要每个数组写一套重复的索引判断逻辑。

修复后的核心代码片段

#include <Keypad.h>
#include <IRremote.h>
const int ROW_NUM = 4;
const int COLUMN_NUM = 4;
int RECV_PIN = 11;
IRrecv irrecv(RECV_PIN);
decode_results results;
IRsend irsend;
// 四个存储红外信号的数组
int A[10] = {0};
int B[10] = {0};
int C[10] = {0};
int D[10] = {0};
// 指针数组统一管理四个存储数组
int* stored_arrays[] = {A, B, C, D};

char keys[ROW_NUM][COLUMN_NUM] = {
  {'1','2','3', 'A'},
  {'4','5','6', 'B'},
  {'7','8','9', 'C'},
  {'*','0','#', 'D'}
};

byte pin_rows[ROW_NUM] = {2, 3, 4, 5};
byte pin_column[COLUMN_NUM] = {6, 7, 8, 9};

Keypad keypad = Keypad( makeKeymap(keys), pin_rows, pin_column, ROW_NUM, COLUMN_NUM );

void setup(){
  Serial.begin(9600);
  irrecv.enableIRIn();
}

void loop(){
  char key = keypad.getKey();
  if (key == '#'){
    irsend.sendRC5(0x0, 8);
    delay(200);
    irsend.sendRC5(0x1, 8); 
    delay(200); 
    // 等待用户选择数组
    char array_choice;
    while( !(array_choice = keypad.getKey()) );
    int array_idx = -1;
    if(array_choice == 'A') array_idx = 0;
    else if(array_choice == 'B') array_idx = 1;
    else if(array_choice == 'C') array_idx = 2;
    else if(array_choice == 'D') array_idx = 3;
    if(array_idx == -1) return; // 按的不是A/B/C/D直接退出
    // 等待用户选择信号索引
    char index_char;
    while( !(index_char = keypad.getKey()) );
    if(index_char < '0' || index_char > '9') return; // 按的不是数字直接退出
    int signal_idx = index_char - '0';
    // 发射对应信号
    irsend.sendRC5(stored_arrays[array_idx][signal_idx], 8);
    delay(200);
  }
  if (key == '*') {
    if (irrecv.decode(&results)) {
      Serial.println(results.value, HEX);
      irrecv.resume();
    }
  }
}

编译错误排查技巧

如果Arduino IDE没有显示具体错误位置,按以下操作排查:

  1. 打开IDE的详细编译输出:文件 -> 首选项 -> 编译过程中显示详细输出,勾选后重新编译,就能看到具体的报错行号和错误原因。
  2. 分段注释代码排查:先注释掉loop函数内所有逻辑,只保留空loop函数,编译没问题后逐步放开注释,直到触发报错,即可定位到错误代码段。

内容的提问来源于stack exchange,提问作者Megatoh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.20 13:15:05