请教关于记录(Record)类型拷贝到string的问题(40分)

  • 主题发起人 主题发起人 acdc
  • 开始时间 开始时间
A

acdc

Unregistered / Unconfirmed
GUEST, unregistred user!
有这样的记录:

PRecord = ^TRecord;
TRecord = packed record
Head : array[0..11] of Char;
end;


调用:

procedure TForm1.Button1Click(Sender: TObject);
var
aAry:array[0..SizeOf(TRecord)] of Char;
begin

FillChar(aAry,SizeOf(aAry),'a');
FunTest(@aAry);

end;

procedure TForm1.FunTest(pBuf:PChar);
var
pRcd:PRecord;
sTmp:string;
begin

pRcd := Pointer(pBuf);

sTmp := pRcd.Head;//如果没有这条赋值语句,下面的move会出错。
Move(pRcd.Head,PChar(sTmp)^,SizeOf(pRcd.Head));


Memo1.Lines.Add(sTmp);

end;

把记录类型扩展一下:

PTBC_HEAD = ^TTBC_HEAD;
TTBC_HEAD = packed record
PckLen: array[0..3] of Char;
BizNo : array[0..1] of Char;
CmdNo : array[0..1] of Char;
SeqNo : array[0..3] of Char;
end;

PRecord = ^TRecord;
TRecord = packed record
Head : TTBC_HEAD;
end;


procedure TForm1.Button1Click(Sender: TObject);
var
aAry:array[0..SizeOf(TRecord)] of Char;
begin

FillChar(aAry,SizeOf(aAry),'a');
FunTest(@aAry);

end;

procedure TForm1.FunTest(pBuf:PChar);
var
pRcd:PRecord;
sTmp:string;
begin

pRcd := Pointer(pBuf);

sTmp := pRcd.Head.PckLen;//如果没有这条赋值语句,下面的move会出错。
Move(pRcd.Head,PChar(sTmp)^,SizeOf(pRcd.Head));

Memo1.Lines.Add(sTmp);//现在是这里会出错了。

end;
 
String类型不能用Move,因为它是由内存管理器自动管理长度和引用数的。我记得array of char可以直接转换,用
string(pRcd.Head)就可以了
 
sTmp := pRcd.Head;//就已经赋值了
这是delphi自动处理的。
此时已经为stmp申请了空间。如果没有此句,stmp没有分配空间使用move就会出错。
也可以先设置字符串的长度,为字符串申请空间,在Move就不会出错
SetLength(stmp,Sizeof(TRecord));
Move(pRcd.Head,PChar(sTmp)^,SizeOf(pRcd.Head));
 
还真是这样的,谢谢两位。

Move函数跟普通的赋值是有区别的啊,以后得注意了。
 

Similar threads

后退
顶部