我在执行以下操作时遇到问题:
“ 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。 任何人都知道我在使用指针时错了吗? 谢谢
答案 0 :(得分:1)
您给我们提供了无效的C ++代码,其中包含许多错误。
您想给我们提供String和alloc1的定义
您错过了给我们执行的任务,通常是 myPublicMethod
的参数因此,要回答您的问题,我们需要使用魔术水晶球
一种可能性是(arrName == "A")
和(arrName == "B")
为假,因此您无需初始化ptr。例如,当String的定义为typedef const char * String;
答案 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,他间接给了我停止思考指针的理由。如果有人刚刚确认在我的第一个示例之后,指针在逻辑上是正确的,那将对我有很大帮助。
干杯