原帖看此:http://topic.csdn.net/u/20101127/13/a5b7798f-2763-4124-bc90-09117bd418c0.html?864120222
Release下生成的程序会有问题,Debug没有问题。
问题出在free函数上,会导致程序崩溃。
事实上,只只有在函数外申请了至少1个全局变量的空间,就不会出问题了。
这到底是为什么?痛苦。
全项目SVN地址:https://newsnake.svn.sourceforge.net/svnroot/newsnake
根据schlafenhamster大哥提出的想法,改成的函数如下,有同样的问题。求解答。
void LoadMap(HWND hWnd,int iLevel)
{
char szFileName[50];
wsprintf(szFileName,"MAP\\level%d.map",iLevel);
if (mMap.MapElement!=NULL)
{
free(mMap.MapElement);
mMap.MapElement=NULL;
}
FILE * fpMapFile=fopen(szFileName,"rb"); if (fpMapFile==NULL)
{
MessageBox(hWnd,"地图读取失败!文件未找到!\n游戏退出!","错误",MB_NOFOCUS);
PostQuitMessage(0);
}
int j;
//char ReadBuffer[2000];
//memset(ReadBuffer,0,sizeof(ReadBuffer));
fseek(fpMapFile,0,2);
j=ftell(fpMapFile); mMap.iNumber=j/3;
mMap.MapElement=(stMapElement *)malloc(sizeof(stMapElement)*(mMap.iNumber+10));
if (mMap.MapElement==NULL)
{
MessageBox(hWnd,"内存分配失败!地图读取失败!\n游戏退出","错误",MB_NOFOCUS);
PostQuitMessage(2);
}
fseek(fpMapFile,0,0);
int x=0;
while(!feof(fpMapFile))
{
fread(&mMap.MapElement[x].vx,sizeof(char),1,fpMapFile);
fread(&mMap.MapElement[x].vy,sizeof(char),1,fpMapFile);
fread(&mMap.MapElement[x++].iStyle,sizeof(char),1,fpMapFile);
} fclose(fpMapFile);
// mMap.iNumber=j/3;
//
// mMap.MapElement=(stMapElement *)malloc(sizeof(stMapElement)*(mMap.iNumber+1));
// for (int k=0,x=0; k<j; x++)
// {
// mMap.MapElement[x].vx=ReadBuffer[k++];
// mMap.MapElement[x].vy=ReadBuffer[k++];
// mMap.MapElement[x].iStyle=ReadBuffer[k++];
// }}目前得到的解决办法为,在函数外定义任意全局变量。只求原因。
Release下生成的程序会有问题,Debug没有问题。
问题出在free函数上,会导致程序崩溃。
事实上,只只有在函数外申请了至少1个全局变量的空间,就不会出问题了。
这到底是为什么?痛苦。
全项目SVN地址:https://newsnake.svn.sourceforge.net/svnroot/newsnake
根据schlafenhamster大哥提出的想法,改成的函数如下,有同样的问题。求解答。
void LoadMap(HWND hWnd,int iLevel)
{
char szFileName[50];
wsprintf(szFileName,"MAP\\level%d.map",iLevel);
if (mMap.MapElement!=NULL)
{
free(mMap.MapElement);
mMap.MapElement=NULL;
}
FILE * fpMapFile=fopen(szFileName,"rb"); if (fpMapFile==NULL)
{
MessageBox(hWnd,"地图读取失败!文件未找到!\n游戏退出!","错误",MB_NOFOCUS);
PostQuitMessage(0);
}
int j;
//char ReadBuffer[2000];
//memset(ReadBuffer,0,sizeof(ReadBuffer));
fseek(fpMapFile,0,2);
j=ftell(fpMapFile); mMap.iNumber=j/3;
mMap.MapElement=(stMapElement *)malloc(sizeof(stMapElement)*(mMap.iNumber+10));
if (mMap.MapElement==NULL)
{
MessageBox(hWnd,"内存分配失败!地图读取失败!\n游戏退出","错误",MB_NOFOCUS);
PostQuitMessage(2);
}
fseek(fpMapFile,0,0);
int x=0;
while(!feof(fpMapFile))
{
fread(&mMap.MapElement[x].vx,sizeof(char),1,fpMapFile);
fread(&mMap.MapElement[x].vy,sizeof(char),1,fpMapFile);
fread(&mMap.MapElement[x++].iStyle,sizeof(char),1,fpMapFile);
} fclose(fpMapFile);
// mMap.iNumber=j/3;
//
// mMap.MapElement=(stMapElement *)malloc(sizeof(stMapElement)*(mMap.iNumber+1));
// for (int k=0,x=0; k<j; x++)
// {
// mMap.MapElement[x].vx=ReadBuffer[k++];
// mMap.MapElement[x].vy=ReadBuffer[k++];
// mMap.MapElement[x].iStyle=ReadBuffer[k++];
// }}目前得到的解决办法为,在函数外定义任意全局变量。只求原因。
MapElement
stMapElement
{
char vx,vy,iStyle;
} stMapElement;typedef struct tagMap //地图元素顺序表结构
{
stMapElement *MapElement;
int iNumber;
} stMap;stMap mMap;
函数:void InitLevel(HWND hwnd,int iLevel)将格式化输入语句 fscanf(fp,"%d,%d\n%d\n%d\n%d\n%d\n%d",&lLevel.iInitX,&lLevel.iInitY,&lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,&lLevel.iFoodVariety,&lLevel.iItemVariety);
更改为
fscanf(fp,"%d,%d\n%d\n%d\n%d\n%c\n%c",&lLevel.iInitX,&lLevel.iInitY,&lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,&lLevel.iFoodVariety,&lLevel.iItemVariety);
// &lLevel.iInitX,&lLevel.iInitY,
// &lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,
// &lLevel.iFoodVariety,&lLevel.iItemVariety);
fscanf(fp,"%d,%d\n%d\n%d\n%d\n%c\n%c", //%c
&lLevel.iInitX,&lLevel.iInitY,
&lLevel.iInitInterval,&lLevel.iInitDirect,&lLevel.iFoodNumbers,
&lLevel.iFoodVariety,&lLevel.iItemVariety); //char使用"%d,%d\n%d\n%d\n%d\n%d\n%d"格式化字符串将导致stMapElement *MapElement的值被改写,更改发生在低字节,使得低字节被置0。 我这里测试的结果就是 0xXXXXXX28 变成了 0xXXXXXX00
主要还是 感谢schlafenhamster!感谢你一直关注我的帖子 最终帮我解决问题!