release生成的.exe文件不能正常运行?

tiancaiak 2007-09-15 11:17:46
我写了一个寻路的函数


debug生成的.exe文件可以正常寻路

但release生成的.exe文件运行时却不能寻到两点间的路径
...全文
307 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiancaiak 2007-10-11
  • 打赏
  • 举报
回复
tiancaiak 2007-09-26
  • 打赏
  • 举报
回复
就下面这段代码:

若是release下,Path* CPath::GetPath(),就返回空值,debug下就不会


#include "Path.h"
#include <iostream.h>
#include <memory.h>
#include <stdlib.h>

CPath::CPath()
{
}

CPath::CPath( int bx, int by, int tx, int ty, int MapW, int MapH, stEvent* Block )
{
this->MapW = MapW;
this->MapH = MapH;
this->Block = Block;
Level = -1;

x = bx;
y = by;
TargetX = tx;
TargetY = ty;

Table = new int[MapH*MapW];
memset( Table, 0, sizeof(Table) );

AllComplete = 0;
LevelComplete = 0;
}

CPath::~CPath()
{
}

BOOL CPath::Test( )
{
if ((x==TargetX)&&(y==TargetY)) //已到目标
{
for (int i=0;i<=Level;i++)
{
switch( Act[i] )
{
case 1:
Act[i] = 2;
break;
case 2:
Act[i] = 0;
break;
case 3:
Act[i] = 1;
break;
case 4:
Act[i] = 3;
break;
}
}

LevelComplete=AllComplete=1; //完成搜索
return TRUE;
}
return FALSE;
}


void CPath::Back( )
{
int dx[4]={0,0,-1,1}; //四种移动方向对x和y坐标的影响
int dy[4]={-1,1,0,0};

x-=dx[Act[Level-1]-1];
y-=dy[Act[Level-1]-1]; //退回原来的点
Table[y*MapW+x]=0; //清除已到过标记
Act[Level]=0; //清除方向
Level--; //回上一层
}


int CPath::ActOK( )
{
int dx[4]={0,0,-1,1}; //四种移动方向对x和y坐标的影响
int dy[4]={-1,1,0,0};

int tx=x+dx[Act[Level]-1]; //将到点的x坐标
int ty=y+dy[Act[Level]-1]; //将到点的y坐标

if (Act[Level]>MaxAct) //方向错误?
return 0;
if ((tx>=MapW)||(tx<0)) //x坐标出界?
return 0;
if ((ty>=MapH)||(ty<0)) //y坐标出界?
return 0;
if (Table[ty*MapW+tx]==1) //已到过?
return 0;
if (Block[ty*MapW+tx].Block==1) //有障碍?
return 0;

x=tx;
y=ty; //移动
Table[y*MapW+x]=1; //做已到过标记
return 1;
}
int CPath::GetNextAct( )
{
int dx[4]={0,0,-1,1}; //四种移动方向对x和y坐标的影响
int dy[4]={-1,1,0,0};
int dis[4]; //按四个方向移动后离目标距离
int order[4]; //四个方向搜索次序
int t=32767;
int tt=2;
for (int i=0;i<4;i++)
dis[i]=abs(x+dx[i]-TargetX)+abs(y+dy[i]-TargetY);
for (i=0;i<4;i++)
if (dis[i]<t)
{
order[0]=i+1;
t=dis[i];
}
if (Act[Level]==0)
{
return order[0];
}
order[1]=-1;

for (i=0;i<4;i++)
{
if ((dis[i]==t)&&(i!=(order[0]-1)))
{
order[1]=i+1;
break;
}
}

if (order[1]!=-1)
{
for (i=0;i<4;i++)
{
if (dis[i]!=t)
{
order[tt]=i+1;
tt++;
}
}
}
else
{
for (i=0;i<4;i++)
{
if (dis[i]!=t)
{
order[tt-1]=i+1;
tt++;
}
}
}

if (Act[Level]==order[0])
return order[1];
if (Act[Level]==order[1])
return order[2];
if (Act[Level]==order[2])
return order[3];
if (Act[Level]==order[3])
return 5;
}

Path* CPath::GetPath()
{
memset(Act,0,sizeof(Act)); //清零
memset(Table,0,sizeof(Table));
Table[y*MapW+x]=1; //做已到过标记

while (!AllComplete) //是否全部搜索完
{
Level++;
LevelComplete=0; //搜索下一步

while (!LevelComplete)
{
Act[Level]=GetNextAct( ); //改变移动方向
if (ActOK( )) //移动方向是否合理
{
if( Test( ) ) //测试是否已到目标
{
Path* path = NULL;
Path* p = NULL;
path = new Path;
path->num = (int)Act[0];
path->next = NULL;
p = path;

//返回Path路径
for (int i=1;i<=Level;i++)
{
p->next = new Path;
p = p->next;
p->num = (int)Act[i]; //输出结果
p->next = NULL;
}

if( Table )
{
delete[] Table;
Table = NULL;
}
return path;
}

LevelComplete=1; //该步搜索完成
}
else
{
if (Act[Level]>MaxAct) //已搜索完所有方向
Back( ); //回上一步

if (Level<0) //全部搜索完仍无结果
LevelComplete=AllComplete=1; //退出
}
}
}

if( Table )
{
delete[] Table;
Table = NULL;
}

return NULL;
}
ckt 2007-09-15
  • 打赏
  • 举报
回复
debug 和 release 可能对一些你没初始化的变量做不同的赋值
最好是把变量的值都初始化。
sms88 2007-09-15
  • 打赏
  • 举报
回复
不懂
独孤过儿 2007-09-15
  • 打赏
  • 举报
回复
是程序不能运行了还是不能正常运行了?这两个的概念是不同的啊!

如果是不能运行了,那可能是你的程序有库依赖的问题;要是不能正常运行了,那可能是编译器

做了某些优化,导致你的debug版本和release版本会产生不同的结果。
tiancaiak 2007-09-15
  • 打赏
  • 举报
回复
release下就不能走了,寻不到路
飞哥 2007-09-15
  • 打赏
  • 举报
回复
难道说你两种方式还走了不同的分支?

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧