You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ESP32项目中二维数组行数计算函数返回值始终为1的问题

问题根源

在C/C++中,当二维数组作为参数传递给函数时,会退化为指向数组首元素的指针。ESP32是32位架构,指针大小为4字节,所以sizeof(rgb)返回4;而sizeof(rgb[0])是单个一维RGB数组的大小(3字节),4/3取整后得到1,这就是length始终为1的核心原因。

两种解决方案

方案1:手动传递数组长度

在定义数组的作用域内计算行数(此时sizeof能正确获取数组总大小),再将长度作为参数传入函数:

修改调用代码:

if (counter == 0) {
    uint8_t rgb[4][3] = { {0xff, 0x00, 0x00}, {0xff, 0x11, 0x11}, {0xea, 0x1f, 0x10}, {0xff, 0x00, 0x00} };
    int rgbCount = sizeof(rgb) / sizeof(rgb[0]); // 此处计算得到正确的行数4
    gradientFunction(rgb, rgbCount);
    Serial.println("Red gradient");
}

修改函数定义:

void gradientFunction(uint8_t rgb[][3], int length) {
  Serial.println(length); // 现在会打印正确的行数
  for (int i = 0; i < length; i++) {
    uint8_t bytes[9] = {0x7b, 0x01 + i, 0x0e, 0xfd, rgb[i][0], rgb[i][1], rgb[i][2], length, 0xbf};
    pRemoteCharacteristic->writeValue(bytes, 9);
    delay(100);
  }
}

方案2:使用模板函数自动推导长度

利用模板让编译器在编译阶段自动推导数组行数,无需手动传递参数:

修改函数定义为模板:

template<int RowCount>
void gradientFunction(uint8_t (&rgb)[RowCount][3]) {
  int length = RowCount;
  Serial.println(length); // 正确打印数组行数
  for (int i = 0; i < length; i++) {
    uint8_t bytes[9] = {0x7b, 0x01 + i, 0x0e, 0xfd, rgb[i][0], rgb[i][1], rgb[i][2], length, 0xbf};
    pRemoteCharacteristic->writeValue(bytes, 9);
    delay(100);
  }
}

调用时无需额外修改,直接传入数组即可:

gradientFunction(rgb);

该方案的优势是适配任意行数的RGB数组,无需手动计算和传递长度。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 22:23:39