描述:
本人有一程序,用于播放实时图像和历史回放,实时图像没问题,有问题的是历史图像(debug下正常,release不正常):主要差别为:实时播放时,系统发过来的图像信息前有6个字节的信息头,回放存储的文件是没有这6个信息头的,于是我在读回放文件时,人为加了6个字节的头:
此段程序用于从文件中读取数据,放入对应buffer中:
f = fopen(fileN, "rb" );
if (f==NULL)
{
return 0;
}
fseek(f, current_size, SEEK_SET);
if (fread(s, sizeof( char ), 2, f) > 1)
{
unsigned short size = s[0]*256 +s[1];
if (size>0)
{
m_csRecv[WINDOWSNUM].Lock();
fread(vv[WINDOWSNUM].data, sizeof( char ), size, f);
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
if(recvlenall[WINDOWSNUM]+size+6<Q_SIZE)//
{
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,size+6);//
recvlenall[WINDOWSNUM]+=size+6;//11
}
else
{
int endlen = recvlenall[WINDOWSNUM]+size+6;//11
int leavelen = Q_SIZE - recvlenall[WINDOWSNUM];
memcpy(recvbufferall[WINDOWSNUM]+recvlenall[WINDOWSNUM],vv[WINDOWSNUM].data,leavelen);
recvlenall[WINDOWSNUM]+=leavelen;
recvlenall[WINDOWSNUM] = 0;
unsigned long headlen = endlen%Q_SIZE;
if((headlen < readlp[WINDOWSNUM])||(headlen == readlp[WINDOWSNUM]))
{
memcpy(recvbufferall[WINDOWSNUM],vv[WINDOWSNUM].data+leavelen,headlen);
recvlenall[WINDOWSNUM] = headlen;
}
}//else
m_csRecv[WINDOWSNUM].Unlock();
}
fclose(f);
return current_size+size+2;
}
问题在这段代码:
memcpy(vv[WINDOWSNUM].data+6,vv[WINDOWSNUM].data,size);
vv[WINDOWSNUM].data[0] = HIBYTE(writenum);
vv[WINDOWSNUM].data[1] = LOBYTE(writenum);
vv[WINDOWSNUM].data[2] = HIBYTE(size+6);
vv[WINDOWSNUM].data[3] = LOBYTE(size+6);//11
vv[WINDOWSNUM].data[4]=0;
vv[WINDOWSNUM].data[5] = 0;/**/
vv[WINDOWSNUM].len = size+6;//
vv[WINDOWSNUM].m_picHwnd = hwnd;
writenum++;
加上这6个字节,则历史回放不正常,不加需要修改记录时文件的存储格式,可以做到播放正常,但是和以往软件不兼容,我希望在能和以往软件兼容,但是这段代码应该没问题,因为debug下他是好的。可是到底问题在哪里呢,请高手指点!
解决方案1:
gz
解决方案2:up
解决方案3: 未初始化的变量在debug下可能是有一个初始值的,因为是VC在帮你管理内存,但是Release就可能是任意值了,要看该位置以前做了什么。
你仔细检查一下这加上去的六个字节的值对不对,会不会影响处理端。
Debug版本包括调试信息,所以要比Release版本大很多(可能大数百K至数M)。至于是否需要DLL支持,主要看你采用的编译选项。如果是基于ATL的,则Debug和Release版本对DLL的要求差不多。如果采用的编译选项为使用MFC动态库,则需要MFC42D.DLL等库支持,而Release版本需要MFC42.DLL支持。
您可能想查找下面的文章:
- Debug版本出错Release版本运行正常是怎么回事?
- WM_NCMOUSEMOVE消息在Release和Debug版本下出现不同现象
- 使用COM时编译时通过,DEBUG运行不了,RELEASE可以运行!
- Debug和Release版本编译问题急!急!急!急!
- Debug版ATL可用regsvr32正常注册,而Release版注册失败,为什么?
- 串口程序debug版正常,release版读不出数据
- debug可以通过运行,release为什么不行?
- MFCActiveX在Release时报错未能注册输出,但是DEBUG下正常
- 关于Debug和Release编译出错问题
- 在Debug下没有问题,Release下出错

