一个奇怪的问题

时间:2022-08-23 00:28:41
我遇到的问题是:在一个类的成员函数中,我定义了一个OBJ* TEM_Obj类型,并把指向另一个OBJ* 类型的实例-----CurObj,即OBJ* TEM_Obj=CurObj.可是它的地址成了0x00000000,并且系统不能访问它的指针,而CurObj却有实际的地址的。
    这到底是怎么回事呢?

13 个解决方案

#1


把代码放上来看看

#2


///Coxy代表坐标,这个成员函数作用是向MapObj[x][y]加入OBJ*类型的双向连表,MapObj[x][y]为MAPOBJ类型,是双向连表的表头,它的->Obj_Next是OBJ*类型

int TMapWorld::AddMapObj(OBJ* TEM_MapObj,MAPOBJCOXY MapObjCoxy)
{
TEM_MapObj->Obj_Forward=NULL;
int x=MapObjCoxy.MapObjX;
int y=MapObjCoxy.MapObjY;

if(MapObj[x][y]->Obj_Count==0)///如果原来MapObj[x][y]就没有连接OBJ*类型,则执行,这些都很正常
{
MapObj[x][y]->Obj_Next=TEM_MapObj;
TEM_MapObj->Map_Obj_Coxy=&MapObj[x][y]->MapObj_Coxy;
TEM_MapObj->Obj_Forward=NULL;
TEM_MapObj->Obj_Next=NULL;
MapObj[x][y]->Obj_Count++;
return(SUCCESS);
}

   /////从这里开始出问题了/////
else if(MapObj[x][y]->Obj_Count>=1)
{
OBJ* Pre_MapObj;
Pre_MapObj=MapObj[x][y]->Obj_Next;//////这句好象不执行了,就象消失掉一样,郁闷。。。


while(TEM_MapObj->Obj_Pos.y>Pre_MapObj->Obj_Pos.y)//程序在这里执行时出错,提示TEM_MapObj地址为0x00000000,不能访问。而MapObj[x][y]->Obj_Next是有实际地址的
Pre_MapObj=Pre_MapObj->Obj_Next;

TEM_MapObj->Obj_Next=Pre_MapObj->Obj_Next;
TEM_MapObj->Obj_Next->Obj_Forward=TEM_MapObj;
Pre_MapObj->Obj_Next=TEM_MapObj;
TEM_MapObj->Map_Obj_Coxy=&MapObj[x][y]->MapObj_Coxy;
MapObj[x][y]->Obj_Count++;
return(SUCCESS);
}
return(FAIL);
}




有哪位高手帮帮忙啊

#3


给Pre_MapObj指定[x][y]试试。另外,把Pre_MapObj定义成全局变量。

#4


不行呀,都试过了,Pre_MapObj就是0x00000000  好奇怪呀

#5


使用函数AddMapObj时,传入的参数是什么?
MapObj是哪里来的?数据成员?

#6


。。。
你把:
while(TEM_MapObj->Obj_Pos.y>Pre_MapObj->Obj_Pos.y)
改成:
while(Pre_MapObj!=NULL && TEM_MapObj->Obj_Pos.y > Pre_MapObj->Obj_Pos.y)

#7


MapObj是我自己定义的存储游戏精灵的一些信息的类型---OBJ类型 ,OBJ主要存储精灵的绝对坐标,相应的精灵地图坐标,所在层,能否穿越等。
MAPOBJCOXY MapObjCoxy 是OBJ类型在精灵地图上的位置,MAPOBJ是精灵地图的类型,比如一张16*16的精灵地图,我就定义了MAPOBJ  MapWorld[16][16];如果一个精灵在精灵地图上的位置是3:7,则在MapWorld[3][7]->Obj_Next上就连上这个精灵的OBJ
所以函数AddMapObj传入的参数就是某个精灵的OBJ及相应的在精灵地图上的坐标。

#8


你while的时候都没判断next是否存在就先next了,这个时候你的指针是空的,当然会出错了。

#9



这是我的类型定义

struct MAPOBJCOXY////物件对象的实际坐标类型定义
{
int MapObjX;
int MapObjY;
};


class OBJ   //////////
{
public:
MAPOBJCOXY* Map_Obj_Coxy;
OBJ* Obj_Forward;
ULINT Obj_ID;
COXY Obj_Pos;
LAYER Obj_Layer;
OBJ* Obj_Next;


OBJ(ULINT ObjID,COXY ObjPos,LAYER ObjLayer)
{Obj_ID=ObjID;Obj_Pos=ObjPos;Obj_Layer=ObjLayer;};

};


class MAPOBJ
{
public:
MAPOBJCOXY MapObj_Coxy;
int Obj_Count;
OBJ* Obj_Next;

MAPOBJ(int x,int y)
{
Obj_Count=0;
MapObj_Coxy.MapObjX=x;
MapObj_Coxy.MapObjY=y;
}
};


class TMapWorld  
{

..... ...........

MAPOBJ* MapObj[OBJ_X][OBJ_Y];//物件地图,OBJ_X和OBJ_Y的值是常量,已知的


public:

....... ..... ........




int AddMapObj(OBJ*,MAPOBJCOXY);/////把OBJ加入物件地图MapObj[][]


TMapWorld();////
virtual ~TMapWorld();

};
extern TMapWorld* MapWorld;

#10


to (天星) 

这我是知道的,next不是空的,从vc的watch窗口可以看出的,因为在此之前我已经加入了一个OBJ*对象了,是在加入第二个OBJ时出现错误的。不知你有没看到"else if(MapObj[x][y]->Obj_Count>=1)"这条语句

MapObj[x][y]->Obj_Count是表示当前已有几个OBJ在MapObj[x][y]上的。



问题是空的不是MapObj[x][y]->Obj_Next,而是在函数中定义的Pre_MapObj,而它是指向MapObj[x][y]->Obj_Next的啊?(相应语句:Pre_MapObj=MapObj[x][y]->Obj_Next;)

#11


while(TEM_MapObj->Obj_Pos.y>Pre_MapObj->Obj_Pos.y) Pre_MapObj=Pre_MapObj->Obj_Next;

这个循环是肯定有问题的,你加第一个的时候肯定不会出错的,因为加完以后直接return了。
只要你新加的TEM_MapObj的Obj_Pos.y比你第一次加的大,肯定就会出错,
Pre_MapObj=Pre_MapObj->Obj_Next;

执行完这一句以后,你的Pre_MapObj就是空的了。你不信的话,你第二次加的时候加一个
Obj_Pos.y比第一次加的小的试试,肯定不会出错的。

#12


也许如tarkey(天星) 所言,你的x,y超出范围了。

#13


tarkey(天星)的解释是合理的。
第一次不错,是因为while判断正确,Pre_mapObj=Pre_MapObj->Obj_Next是对的。
但是你没有对Pre_MapObj->Obj_Next是否是NULL进行判断处理,当它是NULL的时候,
再次进入while判断的时候肯定会出现错误的。
也就是说,在你的TEM_MapObj->Obj_Pos.y比Pre_mapObj链表当中的所有数值都大的时候,当索引到链表尾部的时候就会出错。

#1


把代码放上来看看

#2


///Coxy代表坐标,这个成员函数作用是向MapObj[x][y]加入OBJ*类型的双向连表,MapObj[x][y]为MAPOBJ类型,是双向连表的表头,它的->Obj_Next是OBJ*类型

int TMapWorld::AddMapObj(OBJ* TEM_MapObj,MAPOBJCOXY MapObjCoxy)
{
TEM_MapObj->Obj_Forward=NULL;
int x=MapObjCoxy.MapObjX;
int y=MapObjCoxy.MapObjY;

if(MapObj[x][y]->Obj_Count==0)///如果原来MapObj[x][y]就没有连接OBJ*类型,则执行,这些都很正常
{
MapObj[x][y]->Obj_Next=TEM_MapObj;
TEM_MapObj->Map_Obj_Coxy=&MapObj[x][y]->MapObj_Coxy;
TEM_MapObj->Obj_Forward=NULL;
TEM_MapObj->Obj_Next=NULL;
MapObj[x][y]->Obj_Count++;
return(SUCCESS);
}

   /////从这里开始出问题了/////
else if(MapObj[x][y]->Obj_Count>=1)
{
OBJ* Pre_MapObj;
Pre_MapObj=MapObj[x][y]->Obj_Next;//////这句好象不执行了,就象消失掉一样,郁闷。。。


while(TEM_MapObj->Obj_Pos.y>Pre_MapObj->Obj_Pos.y)//程序在这里执行时出错,提示TEM_MapObj地址为0x00000000,不能访问。而MapObj[x][y]->Obj_Next是有实际地址的
Pre_MapObj=Pre_MapObj->Obj_Next;

TEM_MapObj->Obj_Next=Pre_MapObj->Obj_Next;
TEM_MapObj->Obj_Next->Obj_Forward=TEM_MapObj;
Pre_MapObj->Obj_Next=TEM_MapObj;
TEM_MapObj->Map_Obj_Coxy=&MapObj[x][y]->MapObj_Coxy;
MapObj[x][y]->Obj_Count++;
return(SUCCESS);
}
return(FAIL);
}




有哪位高手帮帮忙啊

#3


给Pre_MapObj指定[x][y]试试。另外,把Pre_MapObj定义成全局变量。

#4


不行呀,都试过了,Pre_MapObj就是0x00000000  好奇怪呀

#5


使用函数AddMapObj时,传入的参数是什么?
MapObj是哪里来的?数据成员?

#6


。。。
你把:
while(TEM_MapObj->Obj_Pos.y>Pre_MapObj->Obj_Pos.y)
改成:
while(Pre_MapObj!=NULL && TEM_MapObj->Obj_Pos.y > Pre_MapObj->Obj_Pos.y)

#7


MapObj是我自己定义的存储游戏精灵的一些信息的类型---OBJ类型 ,OBJ主要存储精灵的绝对坐标,相应的精灵地图坐标,所在层,能否穿越等。
MAPOBJCOXY MapObjCoxy 是OBJ类型在精灵地图上的位置,MAPOBJ是精灵地图的类型,比如一张16*16的精灵地图,我就定义了MAPOBJ  MapWorld[16][16];如果一个精灵在精灵地图上的位置是3:7,则在MapWorld[3][7]->Obj_Next上就连上这个精灵的OBJ
所以函数AddMapObj传入的参数就是某个精灵的OBJ及相应的在精灵地图上的坐标。

#8


你while的时候都没判断next是否存在就先next了,这个时候你的指针是空的,当然会出错了。

#9



这是我的类型定义

struct MAPOBJCOXY////物件对象的实际坐标类型定义
{
int MapObjX;
int MapObjY;
};


class OBJ   //////////
{
public:
MAPOBJCOXY* Map_Obj_Coxy;
OBJ* Obj_Forward;
ULINT Obj_ID;
COXY Obj_Pos;
LAYER Obj_Layer;
OBJ* Obj_Next;


OBJ(ULINT ObjID,COXY ObjPos,LAYER ObjLayer)
{Obj_ID=ObjID;Obj_Pos=ObjPos;Obj_Layer=ObjLayer;};

};


class MAPOBJ
{
public:
MAPOBJCOXY MapObj_Coxy;
int Obj_Count;
OBJ* Obj_Next;

MAPOBJ(int x,int y)
{
Obj_Count=0;
MapObj_Coxy.MapObjX=x;
MapObj_Coxy.MapObjY=y;
}
};


class TMapWorld  
{

..... ...........

MAPOBJ* MapObj[OBJ_X][OBJ_Y];//物件地图,OBJ_X和OBJ_Y的值是常量,已知的


public:

....... ..... ........




int AddMapObj(OBJ*,MAPOBJCOXY);/////把OBJ加入物件地图MapObj[][]


TMapWorld();////
virtual ~TMapWorld();

};
extern TMapWorld* MapWorld;

#10


to (天星) 

这我是知道的,next不是空的,从vc的watch窗口可以看出的,因为在此之前我已经加入了一个OBJ*对象了,是在加入第二个OBJ时出现错误的。不知你有没看到"else if(MapObj[x][y]->Obj_Count>=1)"这条语句

MapObj[x][y]->Obj_Count是表示当前已有几个OBJ在MapObj[x][y]上的。



问题是空的不是MapObj[x][y]->Obj_Next,而是在函数中定义的Pre_MapObj,而它是指向MapObj[x][y]->Obj_Next的啊?(相应语句:Pre_MapObj=MapObj[x][y]->Obj_Next;)

#11


while(TEM_MapObj->Obj_Pos.y>Pre_MapObj->Obj_Pos.y) Pre_MapObj=Pre_MapObj->Obj_Next;

这个循环是肯定有问题的,你加第一个的时候肯定不会出错的,因为加完以后直接return了。
只要你新加的TEM_MapObj的Obj_Pos.y比你第一次加的大,肯定就会出错,
Pre_MapObj=Pre_MapObj->Obj_Next;

执行完这一句以后,你的Pre_MapObj就是空的了。你不信的话,你第二次加的时候加一个
Obj_Pos.y比第一次加的小的试试,肯定不会出错的。

#12


也许如tarkey(天星) 所言,你的x,y超出范围了。

#13


tarkey(天星)的解释是合理的。
第一次不错,是因为while判断正确,Pre_mapObj=Pre_MapObj->Obj_Next是对的。
但是你没有对Pre_MapObj->Obj_Next是否是NULL进行判断处理,当它是NULL的时候,
再次进入while判断的时候肯定会出现错误的。
也就是说,在你的TEM_MapObj->Obj_Pos.y比Pre_mapObj链表当中的所有数值都大的时候,当索引到链表尾部的时候就会出错。