偶在编程的过程中遇到了一个奇怪的问题。
代码修改前是这样的:for (...)
{
.......
chHanziLine[1] = chHighByte;
chHanziLine[2] = chLowByte;
EbcdToAscii(chHanziLine,chAscLine,4);pOutBuffer[iOutBufferPos++] = chAscLine[1];
pOutBuffer[iOutBufferPos++] = chAscLine[2];ZeroMemory(chHanziLine,4);
ZeroMemory(chAscLine,4);
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;
.......
}作用是将EBCDIC码的汉字转换成ASCII码。每次读入
两个字节,通过函数转换成为ASCII码,再写入缓冲区。
缓冲区是动态申请的:pOutBuffer =
new
unsigned char
[ iComp3RecordLength * iBufferSize * 2 ];后来发现需要对于写入缓冲区的内容进行检查,
于是就进行了检验,加入了一个if条件,分别
进行处理。可是问题是修改了之后的程序Debug
版本正常,Release版本就出现了问题,在大循
环里最初的两个字节还能正常显示,但是后面的
部分就什么也写不进去了。而且没有任何错误报告.for (...)
{
.......
chHanziLine[1] = chHighByte;
chHanziLine[2] = chLowByte;
EbcdToAscii(chHanziLine,chAscLine,4);
if ( (chAscLine[1] < 0x20) || (chAscLine[1] == 0xFF) )
{
pOutBuffer[iOutBufferPos++] = 0x58;
pOutBuffer[iOutBufferPos++] = 0x58;
}
else
{
pOutBuffer[iOutBufferPos++] = chAscLine[1];
pOutBuffer[iOutBufferPos++] = chAscLine[2];
}
ZeroMemory(chHanziLine,4);
ZeroMemory(chAscLine,4);
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;
.......
}可是当我把代码修改成为这个样子的时候:
if ( (chAscLine[1] < 0x20) || (chAscLine[1] == 0xFF) )
{
pOutBuffer[iOutBufferPos++] = 0x58;
pOutBuffer[iOutBufferPos++] = 0x58;//显示一个对话框确认已经执行代码
MessageBox(.......);}
else
{
pOutBuffer[iOutBufferPos++] = chAscLine[1];
pOutBuffer[iOutBufferPos++] = chAscLine[2];//显示一个对话框确认已经执行代码
MessageBox(.......);}
Release版的程序就可以正常运行了,奇怪?
请高手指点一二,什么原因导致了Release版程序的错误?
代码修改前是这样的:for (...)
{
.......
chHanziLine[1] = chHighByte;
chHanziLine[2] = chLowByte;
EbcdToAscii(chHanziLine,chAscLine,4);pOutBuffer[iOutBufferPos++] = chAscLine[1];
pOutBuffer[iOutBufferPos++] = chAscLine[2];ZeroMemory(chHanziLine,4);
ZeroMemory(chAscLine,4);
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;
.......
}作用是将EBCDIC码的汉字转换成ASCII码。每次读入
两个字节,通过函数转换成为ASCII码,再写入缓冲区。
缓冲区是动态申请的:pOutBuffer =
new
unsigned char
[ iComp3RecordLength * iBufferSize * 2 ];后来发现需要对于写入缓冲区的内容进行检查,
于是就进行了检验,加入了一个if条件,分别
进行处理。可是问题是修改了之后的程序Debug
版本正常,Release版本就出现了问题,在大循
环里最初的两个字节还能正常显示,但是后面的
部分就什么也写不进去了。而且没有任何错误报告.for (...)
{
.......
chHanziLine[1] = chHighByte;
chHanziLine[2] = chLowByte;
EbcdToAscii(chHanziLine,chAscLine,4);
if ( (chAscLine[1] < 0x20) || (chAscLine[1] == 0xFF) )
{
pOutBuffer[iOutBufferPos++] = 0x58;
pOutBuffer[iOutBufferPos++] = 0x58;
}
else
{
pOutBuffer[iOutBufferPos++] = chAscLine[1];
pOutBuffer[iOutBufferPos++] = chAscLine[2];
}
ZeroMemory(chHanziLine,4);
ZeroMemory(chAscLine,4);
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;
.......
}可是当我把代码修改成为这个样子的时候:
if ( (chAscLine[1] < 0x20) || (chAscLine[1] == 0xFF) )
{
pOutBuffer[iOutBufferPos++] = 0x58;
pOutBuffer[iOutBufferPos++] = 0x58;//显示一个对话框确认已经执行代码
MessageBox(.......);}
else
{
pOutBuffer[iOutBufferPos++] = chAscLine[1];
pOutBuffer[iOutBufferPos++] = chAscLine[2];//显示一个对话框确认已经执行代码
MessageBox(.......);}
Release版的程序就可以正常运行了,奇怪?
请高手指点一二,什么原因导致了Release版程序的错误?
chHanziLine[3] = 0x0f; //为什么要写在后面
chHanziLine[1] = chHighByte;
chHanziLine[2] = chLowByte; //感觉你的chHanziLine是定值。
那么为什么每次循环要清零?不太明白你的思路
chHanziLine如果为定值,先清零,在赋值。放在循坏体之外
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;
写在后面是程序需要,都是表示一个标志,因为调用了EbcdToAscii(...)这个函数后会改变这个值的。
分配内存之后已经清零(ZeroMemory(.......);)
chHanziLine不是定值。
谢谢关注!
悄悄问一下如何加入调试信息? ruihuahan(飞不起来的笨鸟) :
我试验一下。UP
ZeroMemory(chHanziLine,4);
ZeroMemory(chAscLine,4);
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;for(....)
{
....
}不知道你的前两个字节正确是不是因为没有初始化,chAscLine[1]的值是随机的而且不小于0x20且不等于0xFF,所以能正确显示。
for(....)
{
chHanziLine[0] = 0x0e;
chHanziLine[3] = 0x0f;
...................
}修改成为这个样子就可以了。大家可以继续讨论一下,究竟是什么原因导致了debug版和release版的运行结果不同。
http://www.codeproject.com/debug/survivereleasever.asp
首先感谢你对于这个问题的关注。
对于你的回答,我想应该这样给你解释一下:
这段代码的逻辑上没有任何问题。以下两个方面都可以证明
1.debug版的程序完全正确。
2.release版的程序只要在那条if 语句的前面或是后面加上一条
MessageBox()的语句后,结果就是正确的。
所以,问题的关键是
从release版本下的程序结果来推测,好像是根本没有执行
IF 语句,因为不论条件是否成立,都应该输出一个字符,或者是
正确的汉字,或者是表示错误的字符‘X’,但是结果是什么也没有输出
这才是问题的关键之所在。
谢谢关注,我正在仔细研读,写得很好!
up一下也可以,共同来探讨一下关于
debug和release版的问题
相信很多朋友也有类似的经历