记录的问题?(100分)

M

mao

Unregistered / Unconfirmed
GUEST, unregistred user!
问题是:程序中定义了这么一个记录
Tusrdata= record
num:integer;
inf:array[0..1024] of char
end;

tSocketData=Record
msgCode: word;
msgLen :word;
case integer of
0: (usrdata:Tusrdata);
1: (order:integer);
end;
pSocketdata= ^TSocketdata;

procedure CreateSocket(var sockdata:pSocketdata);
var
lbuf:array[0..100] of char;
i:integer;
begin
for i;=0 to 99 do
lbuf:='a';
sockdata^.msgcode:=1;
sockdata^.msglen:=104;
sockdata^.usrdata.num:=1;
strplcopy(sockdata^.usrdata.inf,lbuf,100);
//这句话出错,即使是采用for循环赋值也错,报告是 内存访问非法。
end;
 
procedure CreateSocket(var sockdata: TSocketdata);
var
lbuf:array[0..100] of char;
i:integer;
begin
for i:=0 to 99 do
lbuf:='a';
sockdata.msgcode:=1;
sockdata.msglen:=104;
sockdata.usrdata.num:=1;
strplcopy(sockdata.usrdata.inf,lbuf,100);
end;
 
不需要 ^
 
多准备给分了,上机试验了一把,去掉^还是不行。
 
function StrPLCopy(Dest: PChar
const Source: string
MaxLen: Cardinal): PChar;

sockdata是指针,当然不能把^去掉。您的代码我试验没有任何问题:

procedure TForm1.Button1Click(Sender: TObject);
var
a:pSocketData;
begin
New(a);
CreateSocket(a);
Caption:=IntToStr(a^.msgLen);
end;

还有,鉴于CreateSocket过程没有改变指针,而只是改变了指针所指向的内存区域的值,
可以声明为: procedure CreateSocket(sockdata: TSocketdata);
 
算了,结账喽
 
顶部