我定义了一个变量是EdsError类型的。 
它的定义:typedef EdsUInt32 EdsError; 
而EdsUInt32的定义是:typedef unsigned long EdsUInt32; 然后在debug时发现: 
unsigned long test = (unsigned long)err;//此时的err在“监视”窗口中显示为193.int型。 
if(test > 0)//此时tset的值为0,而err的值显示仍为193。这是怎么回事?直接把err放在这里判断,也是按0来进行的。把比较的操作换成== 等都是0值。 
{
  ...
}
这两句是挨着的。本来直接用err判断的,总出问题。才想把err的值取出来看看。release的结果逻辑也不对。
很奇怪的问题。哪位好心人遇见过,帮忙看看。

解决方案 »

  1.   

    unsigned long test = err;//本来就是同一种类型
    写成这样试验一下
    另外就是
    TRACE(L"%ld",err);
    看看到底是什么值,我遇见过watch窗口输出的数不是真实值的情况
      

  2.   

    这个问题你只能问微软呵呵
    trace出来的一样吗?
      

  3.   

    trace出来的是0 。我的代码改成了:unsigned long err = 0;//定义EdsSendStatusCommand( camera, kEdsCameraStatusCommand_UILock, 0);//这行执行完,err在监视中就变成int型的了,值为一个-858993460
    //如果给err安排一个指针,发现在监视窗口中此时的指针和&err的值是不一样的。
    err = EdsSendCommand(camera,kEdsCameraCommand_TakePicture , 0);//err监视显示为193
    TRACE(L"%ld",err);//输出0
    if(err > 0)//进入else执行。
    {
      AfxMessageBox(CAM_ERROR_TAKE);
      exit(0);
    }
    else
    {
      EdsSendStatusCommand( camera, kEdsCameraStatusCommand_UIUnLock,0);
      return;
    }
      

  4.   


    err 定义的是什么类型,watch 中显示的就是什么类型.不会变来变去的.EdsSendCommand(camera,kEdsCameraCommand_TakePicture , 0) 是个什么冬冬.不明不白的另外 把 err 换成 nError,看看结果是不是正确
      

  5.   

    默认0为int类型,有符号类型与无符号类型不能互相判断的!你试试这样定义咯:ULONG NOERROR = 0;
    ..................
    ..................
    if(test > NOERROR)
    {
        ::AfxMessage(_T("Error."));
    } else {
        ::AfxMessage(_T("No error."));
    }
      

  6.   

    “err 定义的是什么类型,watch 中显示的就是什么类型.不会变来变去的.”。可实际查看中确实变了。err定义的是一个unsigned long类型的。在执行了另一个函数后在watch窗口中显示变成了int类型。EdsSendCommand(camera,kEdsCameraCommand_TakePicture , 0)是一个操纵相机拍照的函数。不是由我写的。可是它和我定义的局部变量应该没有关系啊。
      

  7.   

    不明白的是EdsSendCommand(camera,kEdsCameraCommand_TakePicture , 0)怎么会把我变量的类型改了?
      

  8.   

    是指EdsSendStatusCommand( camera, kEdsCameraStatusCommand_UILock, 0);这个函数执行完了堆栈溢出,没有警告,并且把我的变量err的值和类型都改了?这个恐怕比较难吧。还是vc的watch窗口显示的bug?
      

  9.   

    那个显示的193会不会是地址的值呢?呵呵,以前用sscanf犯过搞错类型的错误,输出了地址值
      

  10.   


    193 绝对不会是地址值.WINDOWS 中不允许直接访问内存地址小于64K的地址
      

  11.   

    补充一下:193不是地址值。我在代码外围加上了try catch(...) 没有捉到任何异常。我觉得可能和Eds的函数有关。可是这个不是我写的,这是相机开发包中的函数。
    使用EDSDK中的函数,需要先InitSDK,然后才能使用,操作都完成后,需要执行一个TerminalSDK。相机打开过程,整个返回值都正常,我把相机关了,才出现上面的错误。err的返回值都不真实了。我在想可能是关闭相机后EDSDK自动捕捉到这个事件,然后做了些什么让返回值都为0了。但是我的变量怎么会在watch中也显示错误,从类型到数值,全不对。从关闭相机后,数值很规律的一直是193和int,如果是堆栈溢出,我想应该能catch出来,可是没有。EdsSendCommand(camera,kEdsCameraCommand_TakePicture , 0);这个函数返回执行结果,类型为unsigned long。
    用err来接收这个结果。现在用别的办法解决程序的功能问题了。可是这个奇怪的watch值还是没有变。
      

  12.   

    EdsSendCommand是如何定义的?EdsUInt32 err = EdsSendCommand(camera,kEdsCameraCommand_TakePicture , 0);
    试试。
      

  13.   

    监视窗口中,err表示程序运行过程中发生的最后一次错误的错误码,也就是GetLastError的值。你换一个变量名再试。
      

  14.   

    监视窗口中,err表示程序运行过程中发生的最后一次错误的错误码,也就是GetLastError的值。你换一个变量名再试。
      

  15.   

    16楼正解。监视窗口中有若干的内定义值。 包括寄存器 如 EAX, AX, ......。 err只是其中一个,表示lasterror.err 显示错误号。
    更友好的方式是 err,hr ,可以直接显示解析后的文字错误信息。
      

  16.   

    不知道你的err的值是这么来的,是否有多线程操作?
      

  17.   

    如果你自己启动的线程里没有用到err,就和多线程无关。想知道你的err变量的值是怎么来的?  计算值还是函数返回值?