这到底是怎么回事呢?
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);
}
有哪位高手帮帮忙啊
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是哪里来的?数据成员?
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)
你把:
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及相应的在精灵地图上的坐标。
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;)
这我是知道的,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比第一次加的小的试试,肯定不会出错的。
这个循环是肯定有问题的,你加第一个的时候肯定不会出错的,因为加完以后直接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链表当中的所有数值都大的时候,当索引到链表尾部的时候就会出错。
第一次不错,是因为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);
}
有哪位高手帮帮忙啊
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是哪里来的?数据成员?
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)
你把:
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及相应的在精灵地图上的坐标。
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;)
这我是知道的,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比第一次加的小的试试,肯定不会出错的。
这个循环是肯定有问题的,你加第一个的时候肯定不会出错的,因为加完以后直接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链表当中的所有数值都大的时候,当索引到链表尾部的时候就会出错。
第一次不错,是因为while判断正确,Pre_mapObj=Pre_MapObj->Obj_Next是对的。
但是你没有对Pre_MapObj->Obj_Next是否是NULL进行判断处理,当它是NULL的时候,
再次进入while判断的时候肯定会出现错误的。
也就是说,在你的TEM_MapObj->Obj_Pos.y比Pre_mapObj链表当中的所有数值都大的时候,当索引到链表尾部的时候就会出错。