void SendALL(DWORD IPos, DWORD IId) 

    BYTE buf[10] = {0}; 
    memset(buf,0,10); 
    buf[0] = 0x23; 
    buf[3] = 0x10; 
    *(DWORD *)(buf+2) = IPos; 
    *(DWORD *)(buf+8) = IId; 
} .........郁闷了很久的问题

解决方案 »

  1.   


    procedure TForm1.SendAll(IPos:DWORD;IId:DWORD);
    var
      buf : array [0..9] of Byte;
    begin
      FillChar(buf,Length(buf),0);
      buf[0] := $23;
      buf[3] := $10;
      buf[2] := IPos;
      buf[8] := IId;
      ShowMessage(IntToStr(buf[0]));
    end;
      

  2.   

    不行噢,  参数是DWORD,多字节  定义的数组是Byte,存放不下
      

  3.   

    本帖最后由 bdmh 于 2010-12-29 15:20:25 编辑
      

  4.   

    那段C代码写的时候会越界的
    void SendALL(DWORD IPos, DWORD IId) 

      BYTE buf[10] = {0}; 
      memset(buf,0,10); 
      buf[0] = 0x23; 
      buf[3] = 0x10; 
      *(DWORD *)(buf+2) = IPos; 
      *(DWORD *)(buf+8) = IId; 
    }  
    假设两个参数都最大的DWORD, 0xffffffff               初始内存为 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
    buf[0] = 0x23; 内存为 35, 0, 0, 0, 0, 0, 0, 0, 0, 0
    buf[3] = 0x10; 内存为 35, 0, 0, 16, 0, 0, 0, 0, 0, 0
    *(DWORD *)(buf+2) = IPos; 内存为 35, 0, 255, 255, 255, 255, 0, 0, 0, 0 改写掉 buf[3] = 0x10;的操作
    *(DWORD *)(buf+8) 内存为 35, 0, 255, 255, 255, 255, 0, 0, 255, 255
    另外还有两个越界非法操作
     
      

  5.   

    用lo hi 解决了,谢谢各位的热心...
      

  6.   

    1楼写的没错,但在c++和delphi中结果可能不一样,因为它们处理越界的方式不一样,delphi是直接截断高位,c++是低位向高位填充数组,我觉得c++的处理方式是对的,最好的办法就是想你说的用lo highword和lo highbyte自己拆分高低位然后再给数组赋值。