一个游戏中的一块内存中保存了一段数据
我想定义一个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中的数据的
我想定义一个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中的数据的
解决方案 »
- idudpserver 在WIN7下,收不到数据,怎么回事
- sql2000用户验证问题?
- dll调用的新问题:找不到dll入口点
- 怎样LISTVIEW的内容
- cxDBVerticalGrid
- 如何建立带参数的form1, 如:form1:=Tform1.create(参数1,参数2)?
- 如何得到客户端的IP地址
- 急!我在做毕业设计,用delphi做前台,请问用什么做后台好些呢。狂散分!!!!!!!!1
- 招delphi程序员(北京)
- 在DELPHI7中如何按照关键字批量搜索Tembeddedwb控件的文本内容
- 在delphi中如何获得excel的行数和列数
- 测试一个类中的属性,老是出错呀,大家帮忙给看看
Trec = packed record
str1:string[20];
str2:string[20];
end;
Trec = packed record
str1:string[20];
str2:string[20];
end;
这样不对的
这样做 指向Membuf1
得到的
str1 = 'ABCDEFGH '
str2 = 'est1' str2 掉了一个字符'T'指向Membuf2时
得到的
str1 = 'ABCD'
str2 = '0003'
str2 掉了四个字符'Test'
Prec = ^Trec;
Trec = packed record
str1:string[20];
str2:string[20];
end;指向Membuf1
得到的
str1 = 'BCDEFGH '
str2 = 't1' 指向Membuf2时
得到的
str1 = 'BCD'
str2 = '03'string 类型的 第一个字符原来是长度
这里不能用string类型啊
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;
不是用实例
如果把结构指针实例化 那这样会更简单些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;
case integer of
(0: str1:String[20];
1: str2:String[20];
)
end;
end; 大致是这样吧