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

Arduino兼容Vector库push_back()函数失效问题排查

问题描述

尝试将仅包含0/1的char类型字符串转换为存储整数的Vector,使用Arduino专用Vector库(文档不如C++ STL完善)。编写reception_emission函数,调用reception_emission("01001010101")测试时,串口输出显示字符转整数的过程正常,但最终Vector的size始终为0,push_back()似乎未生效。

函数代码:

void reception_emission(char* message) {
    Vector <int> integers;
    Serial.println(message);
    Serial.println("suite");
    // Convertir la chaîne de caractères en un vecteur d'entiers
    for (int i = 0; i<strlen(message); ++i) {
        
        if (message[i] == '0' || message[i] == '1') {
            //integers.push_back(message[i] - '0')
             Serial.println(message[i]); 
              Serial.println("!!"); 
              const int nb=message[i] - '0';
              Serial.println(nb);
              Serial.println("////");
              
              integers.push_back(nb);
            } // Convertir le caractère en entier
        }
    
    Serial.print("size: "); 
    Serial.println(integers.size()); 
    // Appeler la fonction emission pour chaque entier dans le vecteur
    for (int i = 0; i < integers.size(); ++i) {
        //Serial.println(char(integers[i]));
        emission(laserPin, micros(), integers[i]);
        void_blank(laserPin, micros());
    }
} 

串口输出:

0
!!
0
////
0
!!
0
////
1
!!
1
////
0
!!
0
////
1
!!
1
////
0
!!
0
////
1
!!
1
////
0
!!
0
////
1
!!
1
////
size: 0
问题排查与解决

针对Arduino Vector库push_back()失效、size始终为0的问题,可从以下几点排查修复:

  • 提前为Vector分配内存
    多数Arduino专用Vector库对栈内存的使用限制严格,局部Vector如果未提前分配容量,push_back()可能因内存分配失败而静默失败。在循环前添加integers.reserve(strlen(message));,预先分配足够的内存空间,确保push_back()能正常写入数据:

    void reception_emission(char* message) {
        int msg_len = strlen(message);
        Vector <int> integers;
        integers.reserve(msg_len); // 提前分配内存
        Serial.println(message);
        // ... 后续代码不变
    }
    
  • 检查Vector库的初始化方式
    部分Arduino Vector库要求显式初始化,比如指定初始容量:Vector<int> integers(10);(10为初始容量,可根据字符串长度调整),避免默认构造的Vector处于不可写入的状态。

  • 验证push_back的返回值
    有些Arduino Vector库的push_back()会返回布尔值表示操作是否成功,添加判断代码可以确认是否真的写入成功:

    if (!integers.push_back(nb)) {
        Serial.println("push_back failed!");
    }
    

    如果串口输出push_back failed!,说明内存分配确实存在问题,需要调整内存使用策略(比如将Vector改为全局变量,或使用动态分配)。

  • 改用全局Vector变量
    函数内的局部Vector存储在栈内存中,Arduino的栈空间通常较小(比如AVR核心只有几KB),如果字符串较长,栈内存不足会导致push_back()失效。将Vector<int> integers;移到函数外部作为全局变量,利用更大的堆内存空间存储数据。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 14:22:40