一开始,我的程序创建了一个结构和一个包含结构和两个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
的方式吗?
答案 0 :(得分:2)
您只是违反了访问权限。您应该通过Stepping Into和Stepping Over来调试代码,以找出访问冲突的来源。访问冲突说,您正在尝试引用NULL引用。确保在访问对象之前为对象分配内存。
你有一个for循环,它指定DetectorField [i] [j] = NULL,这意味着location [i] [j]是一个NULL引用。然后你有一个参考DetectorField [Objects [i] .X_Pos] [Objects [i] .Y_Pos]。你可能在那里有一些访问冲突。
答案 1 :(得分: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];
}
似乎没有进行完全初始化,因为Objects
中有10个元素,您只初始化其中的9个。
我想你想要
for (i=0; i<10; i++)
甚至更好
for (i=0; i<(sizeof(Objects)/sizeof(Objects[0])); i++)