1

一开始,我的程序创建了一个结构和一个包含一个结构和两个 int 变量的类。

#define fullwidth 200
#define fullheight 200

typedef struct tiles
{
    unsigned char red, green, blue;
    char* name;
}tiles;

class Units
{
public:

int X_Pos;
int Y_Pos;

tiles MapColour;

}

之后,在主要部分中,我创建了一个二维数组tiles作为 RGB 容器进行显示,并创建了一个对象指针数组来跟踪声明的对象中的任何更改。

int i, j;

tiles fieldd[fullwidth][fullheight];

Units* DetectorField[fullwidth][fullheight];

Units Objects[10];

之后(现在main()),我上传了两个具有有效值的数组,避免了相关问题。

for (j=0;j<fullheight;j++)
{
    for (i=0;i<fullwidth;i++)
    {
        fieldd[i][j] = BASE;
        DetectorField[i][j] = NULL;
    }
}

与对象相同+为指针添加对象内存地址以便能够通过以下方式识别它们DetectorField

for (i=0; i<9;i++)
{
Objects[i].X_Pos = i+2;    //just some values, not important yet
Objects[i].Y_Pos = 2*i+2;
DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos] = &Objects[i];
}

最肯定的是,这还可以。但是现在问题来了!在下一段代码中,我检查了 ; 的每个元素DetectorField。如果所选元素还不是 NULL(这显然意味着它只能是对象的内存地址,因为它无法获取任何其他值 - 如果我知道的话),然后将MapColour变量放入结构数组.

for (j=0;j<fullheight;j++)
{
    for (i=0;i<fullwidth;i++)
    {
        if(DetectorField[i][j] != NULL)
        {
            fieldd[i][j] = DetectorField[i][j]->MapColour;
        }
    }
}

此时,当我尝试运行 MSVC 时,它会给出以下错误消息:Fallen Star.exe 中 0x00411ed7 处的未处理异常:0xC0000005:访问冲突读取位置 0xccccccdc。

我做错什么了?条件内的操作对我来说似乎没问题。问题是我使用的方式fieldd吗?

4

2 回答 2

2

你只是有访问冲突。您应该调试您的代码,通过 Stepping Into 和 Stepping Over 找出访问冲突的来源。访问冲突说,您正在尝试引用 NULL 引用。确保在访问对象之前为对象分配内存。

您有一个分配 DetectorField[i][j] = NULL 的 for 循环,这意味着位置 [i][j] 是 NULL 引用。然后你有一个参考 DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos]。您可能在那里有一些访问冲突。

于 2013-07-20T18:44:19.420 回答
1

这个循环:

for (i=0; i<9;i++)
{
    Objects[i].X_Pos = i+2;    //just some values, not important yet
    Objects[i].Y_Pos = 2*i+2;
    DetectorField[Objects[i].X_Pos][Objects[i].Y_Pos] = &Objects[i];
}

似乎没有进行完整的初始化,因为里面有 10 个元素,Objects而您只初始化了其中的 9 个。

我想你想要

for (i=0; i<10; i++)

甚至更好

for (i=0; i<(sizeof(Objects)/sizeof(Objects[0])); i++)
于 2013-07-20T16:58:54.803 回答