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

