将指向const的指针存储到结构的向量中

时间:2018-12-26 09:33:26

标签: c++ pointers avr-gcc avrdude

我在执行以下操作时遇到问题:

“ A”类:

    const uint8_t arr1[] = {0x00, 0x00, 0x03, 0x00, ...};
    const uint8_t arr2[] = {0xA1, 0x00, 0xFF, 0x00, ...};    

    struct s1 {
         String name;
         uint8_t const * arr;
    };
    std::vector<s1, std::allocator<alloc1>> vect1;
    std::vector<s1>::iterator it = vect1.begin();

   privateMethod1(uint8_t const * ptr) {
      // this method receives pointer correctly, so I can doPrint(ptr)
      s1 myStruct;
      myStruct.name = "name";
      myStruct.arr = ptr;
      vect1.push_back(myStruct);
   }

    myPublicMethod(String arrName) {
        uint8_t const * ptr;
        if(arrName == "A") {
              ptr = arr1;
        } else if(arrName == "B") {
              ptr = arr2;
        }
        privateMethod1(ptr);
    }

稍后,...

  myPublicMethod2() {
      for(; it < vect1.end(); it++) {
         doPrint(it->arr);
         // here the link between pointers broken, 
         // doPrint() shows me random characters
      }
   }

显然,问题是在myStruct中正确存储了arr1或arr2。 任何人都知道我在使用指针时错了吗? 谢谢

2 个答案:

答案 0 :(得分:1)

您给我们提供了无效的C ++代码,其中包含许多错误。

您想给我们提供String和alloc1的定义

您错过了给我们执行的任务,通常是 myPublicMethod

的参数

因此,要回答您的问题,我们需要使用魔术水晶球

一种可能性是(arrName == "A")(arrName == "B")为假,因此您无需初始化ptr。例如,当String的定义为typedef const char * String;

时,这些测试将返回false

答案 1 :(得分:0)

所以,我确实知道了。以下代码与我之前发布的现实示例很接近。

#include <iostream>
#include <string.h>
#include <vector>

const uint8_t arr1[] = {0x00, 0x00, 0x03, 0x00};
const uint8_t arr2[] = {0xA1, 0x00, 0xFF, 0x00};

class A {
public:
    struct s1 {
        std::string name;
        uint8_t const * arr;
    };
    std::vector<s1, std::allocator<s1>> vect1;

    void myPublicMethod(std::string arrName, std::string name) {
        uint8_t const * ptr;
        if(arrName == "A") {
            ptr = arr1;
        } else if(arrName == "B") {
            ptr = arr2;
        }
        privateMethod1(ptr, name);
    }

    void myPublicMethod2() {
        auto i = vect1.begin();
        for(; i < vect1.end(); i++) {
            doPrint(i->arr, i->name);
            // here the link between pointers broken,
            // doPrint() shows me random characters
        }
    }

private:
    void privateMethod1(uint8_t const * ptr, std::string name) {
        // this method receives pointer correctly, so I can doPrint(ptr)
        s1 myStruct;
        myStruct.name = name;
        myStruct.arr = ptr;
        vect1.push_back(myStruct);
    }

    void doPrint(const uint8_t arr[], std::string name) {
        for(uint16_t i = 0; i < sizeof(*arr); i++) {
            if(name.length() > 0) {
                std::cout << arr[i] << '\n';
            } else {
                std::cout << "No name\n";
            }
        }
    }
};


int main() {
    A ca;
    ca.myPublicMethod("A", "");
    ca.myPublicMethod("B", "image");
    ca.myPublicMethod2();
    return 0;
}

此代码只是项目的一小部分(主要代码)。我发现发布整个项目是不可能的/不必要的,因为肯定有很多不必要的东西需要一定时间才能理解。

最初,我认为指针存在问题,尤其是在A :: myPublicMethod中,它创建了* ptr,然后将其转移到A :: privateMethod1中以存储在vect1中。我以为在保存/传输到vect1时出错了,我错了。最近,我在主代码中没有找到vect1的任何更改。 Vector vas创建得很好,问题出在方法doPrint中,特别是在if(name.length()> 0)中。。。因此,我不得不坚持使用主代码的逻辑,而又没有发明一个与众不同的例子现实。

最后,感谢@paulmckenzie,他间接给了我停止思考指针的理由。如果有人刚刚确认在我的第一个示例之后,指针在逻辑上是正确的,那将对我有很大帮助。

干杯