我定义一个如下的结构体: 
type  TQqhrOndutyOxtRe =Record  
           ConNo:String[4];           
           Ktype:String[3];           
           StartDateTime:TDateTime;   
           EndDateTime:TDateTime;     
           Qd:Byte;                   
           StationNo:Byte;            
           StartGlb:Double;           
           EndGlb:Double;             
           Driect:String[7];         
           Limit:Byte;                
         end;然我在使用时,发现以下问题:
  变量: QqhrOndutyOxtRe:TQqhrOndutyOxtRe;
  ShowMessage(IntToStr(Sizeof(QqhrOndutyOxtRe)));   这个显示是字节数是72
  i:=0;
  i:=i+Sizeof(QqhrOndutyOxtRe.ConNo);
  i:=i+Sizeof(QqhrOndutyOxtRe.Ktype);
  i:=i+Sizeof(QqhrOndutyOxtRe.StartDateTime);
  i:=i+Sizeof(QqhrOndutyOxtRe.EndDateTime);
  i:=i+Sizeof(QqhrOndutyOxtRe.Qd);
  i:=i+Sizeof(QqhrOndutyOxtRe.StationNo);
  i:=i+Sizeof(QqhrOndutyOxtRe.StartGlb);
  i:=i+Sizeof(QqhrOndutyOxtRe.EndGlb);
  i:=i+Sizeof(QqhrOndutyOxtRe.Driect);
  i:=i+Sizeof(QqhrOndutyOxtRe.Limit);
  ShowMessage(IntToStr(i));  这个是全部分量字节数相加是52,
  
  而实际定义的结构体字体总数也应该是52,而不应是72,不知道为什么,那位老大能回答呢?
  在线急等.
  

解决方案 »

  1.   

    难道说是InttoStr函数有点问题?偶去找它来瞧一瞧!
      

  2.   

    不是啊,InttoStr函数没有问题,我看了假设写入文件中去也是72个字节啊,不知道为什么,真的很奇怪啊.
      

  3.   

    ConNo:String[4];           
               Ktype:String[3]; 
               Driect:String[7]; 
    问题出在他们的身上 不信你把记录写进文件看一下就明白了
      

  4.   

    跟String[]没关系
    这是编译器优化的结果将不同长度的变量统一空间这样查找起来速度快定义这么多看着头晕,你定义两个看看就明白了type
      AAA=record
        b:btye;
        i:integer;
      end;显示一下看看,AAA的大小是8,给b也分配了4个空间
    但是size(b)=1
      

  5.   

    delphi的内存结构不是很清楚
    如果是C++里的话,一般都会对这种结构进行按4字节的对齐
    以加快内存的加载速度
      

  6.   

    回复人: warmworm(warmworm) ( ) 信誉:100  2005-05-19 23:11:00  得分: 0  
     
     
       delphi的内存结构不是很清楚
    如果是C++里的话,一般都会对这种结构进行按4字节的对齐
    以加快内存的加载速度
      
     不一定是4字节,根据最大的那个对齐
    比如楼主例子里的double就是8字节 :)
      

  7.   

    string[]这种则除外
    不进行对齐
    对齐,哈,这个词好俺前面说了半天,不如这两个字传神
      

  8.   

    原来斑竹是负责解决本版问题,愚还以为斑竹是以分最高、csdn出勤最多,问题提出与解决都较频繁才能做
      

  9.   

    TQqhrOndutyOxtRe =packed Record
               ConNo:String[4];
               Ktype:String[3];
               StartDateTime:TDateTime;
               EndDateTime:TDateTime;
               Qd:Byte;
               StationNo:Byte;
               StartGlb:Double;
               EndGlb:Double;
               Driect:String[7];
               Limit:Byte;                
      end;
    var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
    var test:TQqhrOndutyOxtRe;
    begin
        showmessage(IntToStr(sizeof(test)));
    end;end.
    ///////////////////////////////////////////////////
    ////////////////如果用packed record就可以显示实际的大小了,而且你的String[X]不如改成用array[X] of Char;
      

  10.   

    问题我自己解决,得罪之处,请原谅.实际用packed record定义结构体就可以啊,
      但是我不赞成以上有些说法,结构体本来就是乱定义,只是类型要放在一起,这些我只是实验没有注意.
    heluqing(鉴之小河〖挣大钱娶美女〗) 这位楼主的说法倒挺好.  还是非常谢谢各位.