在main.cpp中有两个数组,如下所示:
...
Element* screen, *buffer;
screen = new Element[GAME_WIDTH * GAME_HEIGHT];
buffer = new Element[GAME_WIDTH * GAME_HEIGHT];
memset(screen, 0, GAME_WIDTH * GAME_HEIGHT * sizeof(Element));
memset(buffer, 0, GAME_WIDTH * GAME_HEIGHT * sizeof(Element));
...
并且,在my element .cpp中有一个函数使用以下数组之一:
void drawElements(Element* screen[GAME_WIDTH * GAME_HEIGHT]) {
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)]->id << std::endl; //Temporary, problem here
}
}
}
当前应该做的只是多次打印0,而不是在调试时抛出该问题标题中所示的异常,就在em.cpp代码片段中的注释处。我读到过,这可能是由于没有初始化对象造成的,但我认为它们是初始化的,因为它们在main.cpp代码片段中被创建并全部设置为0。
我对指针和类似的东西相当陌生,所以这个问题完全有可能是由指针和引用的一些简单的怪癖引起的,但我不太确定发生了什么。
下面是Element结构体的定义:
struct Element {
int id;
float lifetime;
int density;
};
对于那些要求它的人,这里是我在我的问题的一个最小可复制的例子的尝试,它抛出了同样的异常,当通过vc++调试器运行。
struct Broken {
int x = 20;
};
void doSomething(Broken* borked[10000]) {
for (int x = 1; x < 10000 - 1; x++) {
std::cout << borked[x]->x << std::endl; //Throws exception here
}
}
int main()
{
Broken* borked;
borked = new Broken[10000];
memset(borked, 0, 10000 * sizeof(Broken));
doSomething(&borked);
}
声明什么"single"是一个单指针。
变量"screen"在"图纸"中声明;是双指针,而不是单指针。此外,在访问数组中的变量时,不要使用操作符->
Element* screen, *buffer; // <= definition single pointer
screen = new Element[GAME_WIDTH * GAME_HEIGHT];
void drawElements(Element* screen[GAME_WIDTH * GAME_HEIGHT]){ // <= this mean double pointer
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)]->id << std::endl; //Invalid variable access
}
}
}
// wrong call element
std::cout << screen[idx(x, y)]->id << std::endl;
// correct call element
std::cout << screen[idx(x, y)].id << std::endl;
D
void drawElements(Element* screen) {
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)].id << std::endl; //Temporary, problem here
}
}
}
另一个这
void drawElements(Element screen[GAME_WIDTH * GAME_HEIGHT]) {
for (int x = 1; x < GAME_WIDTH - 2; x++) {
for (int y = 1; y < GAME_HEIGHT - 2; y++) {
std::cout << screen[idx(x, y)].id << std::endl; //Temporary, problem here
}
}
}
p。为什么在这个实现中使用单个数组?在这种情况下,通常使用双数组来分隔宽度和高度。