Push_back() 不适用于 Arduino 兼容的矢量库 (c++)

问题描述 投票:0回答:1

我正在尝试将一个字符(仅包含 0/1)转换为一个向量,其中每个单个字符都存储为整数。 他使用 Arduino 的 Vector 库,该库的文档记录不如基本的 c++ STL。 这是函数:

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());
    }
} 

我用 :

来称呼它
reception_emission("01001010101"); 

我打印了很多输出来看看到底是什么问题。 在串行监视器上,我有:

0
!!
0
////
0
!!
0
////
1
!!
1
////
0
!!
0
////
1
!!
1
////
0
!!
0
////
1
!!
1
////
0
!!
0
////
1
!!
1
////
size: 0

这意味着:每个字符都很好地转换为整数并存储在“nb”中。

但是,最后你可以看到向量interger仍然是空的。

那么,这里有什么问题呢? 还没有找到任何东西。

谢谢你。

c++ vector arduino push-back
1个回答
1
投票

std::vector
不同,
Vector
不提供自己的内存存储。你必须自己给它存储空间。

根据自述文件https://github.com/janelia-arduino/Vector/tree/master

类似于C++的序列容器

std::vector
但该容器不是动态分配内存,而是指向外部静态分配的C风格数组。最大大小在编译时是固定的,但可以通过推送来更改大小并从向量中弹出元素。静态内存分配用于避免非常小的嵌入式处理器上的动态分配问题。必须注意不要取消引用空向量、越界访问元素,或在不设置存储数组的情况下使用

因此,您的

integers
向量始终为空,因为它没有任何内容可存储其值。

尝试更多类似这样的事情:

void reception_emission(char* message) {

    const int ELEMENT_COUNT_MAX = ...; // whatever max size is reasonable for your neeeds...
    int storage_array[ELEMENT_COUNT_MAX];
    Vector <int> integers(storage_array);

    int len = strlen(message);
    for (int i = 0; i < len; ++i) {
        if (message[i] == '0' || message[i] == '1') {
            Serial.println(message[i]); 
            Serial.println("!!"); 
            const int nb = message[i] - '0';
            Serial.println(nb);
            Serial.println("////");
              
            integers.push_back(nb);
        }
    }
    
    Serial.print("size: "); 
    Serial.println(integers.size()); 

    for (int i = 0; i < integers.size(); ++i) {
        //Serial.println(char(integers[i]));
        emission(laserPin, micros(), integers[i]);
        void_blank(laserPin, micros());
    }
} 
© www.soinside.com 2019 - 2024. All rights reserved.