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

Particle Photon上C++多维数组取值异常问题求助

搞定你的Particle Photon数组取值问题

嘿,我一眼就看到你代码里的两个关键问题,正是它们导致了那个奇怪的-1069809521值,而不是预期的1000。咱们一步步来拆解和修复:

1. 问题出在哪?

(1)错误的多维指针数组定义

你写的const int* FaceEmoteTimeArray [][FaceSize0] = {FaceEmoteTime0};有大问题:

  • FaceSize0是31(因为你声明了FaceEmoteTime0[31],哪怕只初始化了7个元素),所以这个二维数组的第二维度是31。
  • 你只给第一个位置FaceEmoteTimeArray[0][0]赋值了FaceEmoteTime0(它会退化成int*),剩下的30个位置会被默认初始化为空指针。
  • 当循环到i>=1时,你试图解引用这些空指针(*FaceEmoteTimeArray[FaceNumber][i]),这属于C++里的未定义行为,会读取到内存里的随机垃圾值,就是你看到的奇怪数字。

(2)数组长度不符合预期

你声明了FaceEmoteTime0[31]但只初始化了7个元素,剩下的24个会被自动设为0,这也会让你的总和超出预期(原本只想算7个值的和)。

2. 修复后的代码

// 去掉固定长度,让编译器自动推导出实际初始化的7个元素
const int FaceEmoteTime0[] = {143, 143, 143, 142, 143, 143, 143};
// 现在FaceSize0会正确计算为7
const int FaceSize0 = sizeof(FaceEmoteTime0) / sizeof(FaceEmoteTime0[0]);

// 改成一维指针数组,只存各个表情数组的指针,不需要多余的第二维度
const int* FaceEmoteTimeArray[] = {FaceEmoteTime0};
const int FaceSizeArray[] = {FaceSize0};

// 显式初始化TotalTime,虽然全局变量会默认设0,但显式写出来更清晰
int TotalTime = 0;
int Plays = 0;
int FaceNumber = 0;

void setup() {
  Serial.begin(115200);
}

void loop() {
  if (Plays == 0) {
    for (int i = 0; i < FaceSizeArray[FaceNumber]; i++) {
      // 直接用指针数组访问元素,不需要额外解引用
      TotalTime += FaceEmoteTimeArray[FaceNumber][i];
    }
    Serial.println(TotalTime); // 现在会输出预期的1000
    Plays++;
  }
}

3. 关键改动说明

  • 简化数组定义:把二维指针数组改成一维,因为你只需要存储多个一维数组的指针,不需要冗余的第二维度空间。
  • 修正数组长度计算:让FaceEmoteTime0的长度由初始化列表自动推导,这样FaceSize0就是7,正好对应你要计算的7个值。
  • 修复元素访问方式:FaceEmoteTimeArray[FaceNumber]已经是指向目标数组的指针,直接用[i]就能访问第i个元素,之前的额外*是画蛇添足,还触发了空指针解引用的错误。
  • 显式初始化变量:虽然全局变量TotalTime会默认初始化为0,但显式初始化能让代码更易懂,避免后续维护时的困惑。

这样修改后,代码就能正确计算总和,输出你想要的1000了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:13:10