ValueS:String[20];
    AlarmTS:String[20];
    AlarmIS:String[20];
他们占用的不是60,而是63,因为会自动在后面加上'\0'

解决方案 »

  1.   

    所以对于string,你可以定义成:
        ValueS:array[1..20]of char;
        AlarmTS:array[1..20]of char;
        AlarmIS:array[1..20]of char;
      TRealData=record
        GateWayID:word;    //2
        DPUID:Byte;         //1
        CHID:Byte;           //1
        Alevel:Shortint;     //1
        Value:single;        //4
        ValueS:array[1..20]of char;
        AlarmTS:array[1..20]of char;
        AlarmIS:array[1..20]of char;
      end;
      TRealData=record
        GateWayID:word;    //2
        CHID:Byte;           //1
        Alevel:Shortint;     //1
        Value:single;        //4
        ValueS:array[1..20]of char;
        AlarmTS:array[1..20]of char;
        AlarmIS:array[1..20]of char;
      end;
    这两个的sizeof,前一个是72,后一个是68,他们相比就差了一个byte。
      

  2.   

    第二贴写错了:)
    看出问题了吗???
    如果你学过汇编,应该知道机器内部的存储。
    给你举个简单的例子:
        Ta=record
         a:Byte;
         b:integer;
         c:Byte;
        end;
        Tb=record
         a:Byte;
         c:Byte;
         b:integer;
        end;
    a占12,b占8。现在应该明白了吧:)
    在ta中,integer在机器中必须从可以被4整除的地址存储,所以基址为0,头一个byte占4个
    在tb中,头两个byte理论是两个byte,但是后面是一个integer,所以要补两个,所以是8。
    所以建议你的record应该这样定义
      TRealData=record
        tag:Byte;          //1
        CCUID:Byte;        //1
        DPUID:Byte;        //1
        CHID:Byte;         //1
        Alevel:word;       //2
        GateWayID:word;    //2,此处定义成word,^_^
        Value:single;        //4
        ValueS:array[1..20]of char;   //20
        AlarmTS:array[1..20]of char;  //20
        AlarmIS:array[1..20]of char;  //20
      end;
    这是你的预期的效果。
      

  3.   

    建议你把
    Value:single; 
    放到最后
      

  4.   

    谢谢丑小鸭
    现在的情况是,这个系统是别人做好的,等于这个结构已不能改变了,我现在用VB跟它做一个接口,通过UDP接收它的这种结构的数据包,我怎样才能正确接收数据呢,并把它们赋值给一个相应结构的数据包
      

  5.   

    我在VB程序中定义了相应的结构却不能正确的接收
    public type TRealData
        tag as byte
        GateWayID as integer
        CCUID as byte
        DPUID as byte
        CHID as byte
        Alevel as byte
        Value as single
        ValueS as  String*20
        AlarmTS as String*20
        AlarmIS as String*20
    end type  
      

  6.   

    丑小鸭:
    我又定义了一个结构
    Value:Single;
        ValueS:String[20];
        AlarmTS:String[20];
        AlarmIS:String[20];
    为什么它的长度是68?前面的Value怎么会占五个字节呢?
      

  7.   

    定义记录时,用packed  test = packed record
        v : single;
        s1: string[20];
        s2: string[20];
        s3: string[20];
      end;sizeof(test) = 67
    原因如下:
    Instances of a structured type hold more than one value. Structured types include sets, arrays, records, and files as well as class, class-reference, and interface types. Except for sets, which hold ordinal values only, structured types can contain other structured types; a type can have unlimited levels of structuring.
    By default, the values in a structured type are aligned on word or double-word boundaries for faster access. When you declare a structured type, you can include the reserved word packed to implement compressed data storage. For example,type TNumbers = packed array[1..100] of Real;Using packed slows data access and, in the case of a character array, affects type compatibility. For more information, see Memory management.
      

  8.   

    补充一点:
    前面:
    : cszhz(丑小鸭) (  ) 信誉:100  2002-1-12 12:08:50  得分:0  
     
          ValueS:String[20];
        AlarmTS:String[20];
        AlarmIS:String[20];他们占用的不是60,而是63,因为会自动在后面加上'\0' 这样的解释是错误的!定义string[20],但用sizeof得到21,是因为:实际上该数组总共有21个元素
    第0个是用来存放数组长度的,真正的数据是从元素1~20