一个游戏中的一块内存中保存了一段数据                      
我想定义一个packed record  指针指向这块数据  然后取出相关信息  但出现了问题              
我的代码是大致是这样的 为了清楚 这里把内存中的数据用membuf1  membuf2定义出来                      
这个内存中保存了两个字串  要怎样做啊  头痛很长时间了          
               
type              
    Prec  =  ^Trec;              
    Trec  =  packed record              
             str1:pchar;              
             str2:pchar;              
    end;              
       
var              
         Form1:  TForm1;              
       
         Membuf1:array[1..20] of  char              
         =('A','B','C','D','E','F','G','H',#0,              
           'T','e','s','t','1',#0,#0,#0,#0,#0,#0);              
       
         Membuf2:array[1..20] of char              
         =('A','B','C','D',#0,              
           'T','e','s','t','0','0','0','0','3',#0,#0,#0,#0,#0,#0);              
       
implementation              
       
{$R *.dfm}              
       
procedure  TForm1.Button1Click(Sender: TObject);              
var              
 tmprec:Prec;              
 str1,str2:string;              
begin              
 tmprec:=@Membuf1;              
 str1:=tmprec.str1;              
 str2:=tmprec.str2;              
 memo1.Lines.Add(str1);              
 memo1.Lines.Add(str2);              
       
 tmprec:=@Membuf2;              
 str1:=tmprec.str1;              
 str2:=tmprec.str2;              
 memo1.Lines.Add(str1);              
 memo1.Lines.Add(str2);              
       
end;              
       
       
开始这样写 出错                      
于是改成                      
type              
         Prec   =  ^Trec;              
         Trec   =   packed record              
               str1:string;              
               str2:string;              
         end;              
还是错的                      
       
改成              
type              
         Prec  =  ^Trec;              
         Trec  =  packed  record              
          str1:array[1..9]  of char;              
          str2:array[1..11] of  char;              
         end;              
       
这样可以访问membuf1                      
       
可是这样达不到要求了  我是要定义一个结构取这个buf中的数据的

解决方案 »

  1.   

    Prec   =  ^Trec;              
    Trec   =   packed record              
        str1:string[20];              
        str2:string[20];              
    end;
      

  2.   

    Prec   =  ^Trec;              
    Trec   =   packed record              
        str1:string[20];              
        str2:string[20];              
    end;
    这样不对的 
    这样做 指向Membuf1 
    得到的
    str1 =  'ABCDEFGH '
    str2 = 'est1'  str2 掉了一个字符'T'指向Membuf2时
    得到的
    str1 = 'ABCD'
    str2 = '0003'
    str2 掉了四个字符'Test'
      

  3.   

    刚测试了一下 掉字符更多了
    Prec   =  ^Trec;              
    Trec   =   packed record              
        str1:string[20];              
        str2:string[20];              
    end;指向Membuf1 
    得到的
    str1 =  'BCDEFGH '
    str2 = 't1'  指向Membuf2时
    得到的
    str1 = 'BCD'
    str2 = '03'string 类型的 第一个字符原来是长度
    这里不能用string类型啊
      

  4.   

    可以用PCHAR,出错是因为你没有初始化,可以用char的数组  tmprec:Prec;
      str1,str2:string;
      iPosi: Integer;
    begin
      tmprec.str1 := StrAlloc(10*sizeof(char));
      tmprec.str2 := StrAlloc(10*sizeof(char));  CopyMemory(tmprec.str1, @Membuf1, 20);
      str1:=tmprec.str1;
      iPosi := Length(str1);  CopyMemory(tmprec.str2, @Membuf1[iPosi+2], 10);
      str2:=tmprec.str2;  memo1.Lines.Add(str1);
      memo1.Lines.Add(str2);  CopyMemory(tmprec.str1, @Membuf2, 20);
      str1:=tmprec.str1;
      iPosi := Length(str1);  CopyMemory(tmprec.str2, @Membuf2[iPosi+2], 10);
      str2:=tmprec.str2;  str1:=tmprec.str1;
      str2:=tmprec.str2;
      memo1.Lines.Add(str1);
      memo1.Lines.Add(str2);  StrDispose(tmprec.str1);
      tmprec.str1 := Nil;
      StrDispose(tmprec.str2);
      tmprec.str2 := Nil;
      

  5.   

    谢谢lonoaer 了 不过这不是我想要的答案因为我要做的是用一个结构指针从内存中取字串
    不是用实例 
    如果把结构指针实例化 那这样会更简单些type              
        Prec  =  ^Trec;              
        Trec  =  packed record              
                 str1:pchar;              
                 str2:pchar;              
        end; var
     tmprec:Trec;
     str1,str2:string;
     strlen:integer;
    begin
     tmprec.str1 :=@Membuf1;
     strlen:= lstrlenA(tmprec.str1);
     tmprec.str2 :=@membuf1[strlen + 2]; str1:=tmprec.str1;
     str2:=tmprec.str2;
     memo1.Lines.Add(str1);
     memo1.Lines.Add(str2); tmprec.str1 :=@Membuf2;
     strlen:= lstrlenA(tmprec.str1);
     tmprec.str2 :=@membuf2[strlen + 2]; str1:=tmprec.str1;
     str2:=tmprec.str2;
     memo1.Lines.Add(str1);
     memo1.Lines.Add(str2);
    end;
      

  6.   

    Trec  =  packed record
                case integer of
                (0: str1:String[20];              
                1: str2:String[20];      
                )
                end;              
                         
        end; 大致是这样吧
      

  7.   

    首先既然是packed record,就必须使用string[..]进行长度限定创建变体数组,共享同一内存区,使用的是后来覆盖原则进行保存的