我做了一段程序如下:  
type  
   TTestRecord  =  record  
       Name  :  string[10];        //姓名  
       Sex    :  string[4];          //性别  
       Age    :  Real;                    //年龄    
   end;  
 
var  
   A  :  array  of  Byte;  
   TestRecord  :  TTestRecord;  
   LenOfRecord:  Integer;  
begin  
   LenOfRecord  :=  Sizeof(TestRecord);  
   TestRecord.Name  :=  'guifuli';  
   TestRecord.Sex    :=  '男';  
   TestRecord.Age    :=  23.00;  
   SetLength(A,  LenOfRecord);  
   A  :=  @TestRecord;  
end;  
最后对数组  A  进行处理,发现地址错误,请高手给予指点。谢谢!

解决方案 »

  1.   

    procedure TForm1.Button1Click(Sender: TObject);
    type  
       TTestRecord  =  record
           Name  :  string[10];        //姓名  
           Sex    :  string[4];          //性别  
           Age    :  Real;                    //年龄
       end;var  
       A  :  array  of  Byte;
       TestRecord  :  TTestRecord;
       LenOfRecord:  Integer;
       I: Integer;
       S: string;
    begin
      LenOfRecord  :=  Sizeof(TestRecord);
      TestRecord.Name  :=  'guifuli123';
      TestRecord.Sex    :=  '男';
      TestRecord.Age    :=  23.00;
      SetLength(A,  LenOfRecord);
      A  :=  @TestRecord;  for I := 0 to LenOfRecord - 1 do  // <----
        S := S + Chr(A[I]);             // <----
      ShowMessage(S);                   // <----
    end;能够访问的。
      

  2.   

    A  :=  @TestRecord;在这里@代表啥意思啊?
      

  3.   

    procedure TForm1.Button1Click(Sender: TObject);
    type  
       TTestRecord  =  record
           Name  :  string[9];
           Sex    :  string[2];
           Age    :  string[3];
       end;var  
       A  :^Byte;
       TestRecord  :  TTestRecord;
       LenOfRecord:  Integer;
       I: Integer;
       S: string;
    begin
      LenOfRecord  :=  Sizeof(TestRecord);
      TestRecord.Name  :=  'guihhhhh';
      TestRecord.Sex    :=  '男';
      TestRecord.Age    :=  '23';  A  :=  @TestRecord;  for I :=1 to LenOfRecord do
      begin
        S := S + Chr(A^);
        INC(A);
        end;
      ShowMessage(S);
    end;
    end.  我在跟踪的时候,s:=#8'guihhhhh'#2'男'#2'23';
    请问这里的#8,#2 是啥东西啊?谢谢。
      

  4.   

    就是啊,上面的real 取不出来,我换了string。不知道real的转换。
    可是跟踪的时候,不知道啥玩意。#8,#2的。
    另外这样的方式,如果声明:name:string[N],如果N的大小超过你所赋实际值的1个,
    那么是在编译的时候的结果是s:=#8'guihhhh'#0 一遇到#0的情况下,s 就马上结束了。
    这样的方法可取吗?
      

  5.   

    var
       A  :  array  of  Byte;
       TestRecord  :  TTestRecord;
       LenOfRecord:  Integer;
       I, NameLen, SexLen: Integer;
       S, StrFloat: string;
       RR: PR;
       R: Real;
    begin
      LenOfRecord  :=  Sizeof(TestRecord);
      TestRecord.Name  :=  'guifuli123';
      TestRecord.Sex    :=  '男';
      TestRecord.Age    :=  23.00;
      SetLength(A,  LenOfRecord);
      A  :=  @TestRecord;  NameLen := High(TestRecord.Name);                     // <----
      SexLen := High(TestRecord.Sex);                       // <----
      SetLength(S, LenOfRecord);                            // <----
      for I := 0 to NameLen + SexLen - 1 do                 // <----
        S[I + 1] := Chr(A[I]);                              // <----
      R := PR(Integer(@TestRecord) + NameLen + SexLen + 2)^;// <----
      StrFloat := FormatFloat('0.00', R);                   // <----
      ShowMessage(S);                                       // <----
      ShowMessage(StrFloat);                                // <----
    end;可以读取Real。(Real的位置是通过前面的结构计算出来的)