偶在编程的过程中遇到了一个奇怪的问题。
代码修改前是这样的: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版程序的错误?

解决方案 »

  1.   

    chHanziLine[0] = 0x0e;
    chHanziLine[3] = 0x0f;    //为什么要写在后面
    chHanziLine[1] = chHighByte;
    chHanziLine[2] = chLowByte;   //感觉你的chHanziLine是定值。
    那么为什么每次循环要清零?不太明白你的思路
      

  2.   

    pOutBuffer在分配内存后对其清零
    chHanziLine如果为定值,先清零,在赋值。放在循坏体之外
      

  3.   

    在循环里面我每次都会改变chHighByte和chLowByte的值,所以不是定值。
    chHanziLine[0] = 0x0e;
    chHanziLine[3] = 0x0f;  
    写在后面是程序需要,都是表示一个标志,因为调用了EbcdToAscii(...)这个函数后会改变这个值的。
    分配内存之后已经清零(ZeroMemory(.......);)
    chHanziLine不是定值。
    谢谢关注!
      

  4.   

    Release版本下加入调试信息看看
      

  5.   

    ZeroMemory(chHanziLine,2*sizeof(*chHanziLine));
      

  6.   

    Release版本下加入调试信息看看
    悄悄问一下如何加入调试信息? ruihuahan(飞不起来的笨鸟) :
    我试验一下。UP
      

  7.   

    ruihuahan(飞不起来的笨鸟) :好像不行的。  :(
      

  8.   

    你把 if ( (chAscLine[1] < 0x20) || (chAscLine[1] == 0xFF) )改为if ( (chAscLine[1] < 0x20) && (chAscLine[1] == 0xFF) ) 试试,如果正常,怀疑是你的EbcdToAscii()函数的返回值有问题,再,你应该在for(...)的前面初始化数据:
    ZeroMemory(chHanziLine,4);
    ZeroMemory(chAscLine,4);
    chHanziLine[0] = 0x0e;
    chHanziLine[3] = 0x0f;for(....)
    {
        ....
    }不知道你的前两个字节正确是不是因为没有初始化,chAscLine[1]的值是随机的而且不小于0x20且不等于0xFF,所以能正确显示。
      

  9.   

    谢谢!
    for(....)
    {
    chHanziLine[0] = 0x0e;
    chHanziLine[3] = 0x0f;
    ...................
    }修改成为这个样子就可以了。大家可以继续讨论一下,究竟是什么原因导致了debug版和release版的运行结果不同。
      

  10.   

    看了你的回答,证明我的猜测:“不知道你的前两个字节正确是不是因为没有初始化,chAscLine[1]的值是随机的而且不小于0x20且不等于0xFF,所以能正确显示。”是正确的,由于你没有对chHanziLine[0],chHanziLine[3]初始化,也许debug版的值(随机的,因为未初始化,是指向某一未知地址)刚好在0x20至0xFE之间,而Release版的刚好相反,不在这个范围内,所以出现这个问题。使用任何数据之前最好先初始化,否则经常会出现不可预料的问题而不知道问题在哪。
      

  11.   

    See the classic articles below, FYI: http://www.codeproject.com/debug/releasemode.asp
    http://www.codeproject.com/debug/survivereleasever.asp
      

  12.   

    shines(Othelloing) :
    首先感谢你对于这个问题的关注。
    对于你的回答,我想应该这样给你解释一下:
    这段代码的逻辑上没有任何问题。以下两个方面都可以证明
    1.debug版的程序完全正确。
    2.release版的程序只要在那条if 语句的前面或是后面加上一条
    MessageBox()的语句后,结果就是正确的。
    所以,问题的关键是
    从release版本下的程序结果来推测,好像是根本没有执行
    IF 语句,因为不论条件是否成立,都应该输出一个字符,或者是
    正确的汉字,或者是表示错误的字符‘X’,但是结果是什么也没有输出
    这才是问题的关键之所在。
      

  13.   

    qing_li73(bluemoon) :
    谢谢关注,我正在仔细研读,写得很好!
      

  14.   

    欢迎大家畅所欲言!
    up一下也可以,共同来探讨一下关于
    debug和release版的问题
    相信很多朋友也有类似的经历
      

  15.   

    以上的关于在IF语句的之前和之后加上一条MessageBox就正常的情况曾经遇到过,这个总的来说不知道为什么,但是可以确定的是那个时候那块内存已经乱了,导致这个问题的地方可能并不是出现附近的代码中。