我是在A.PAS文件中调用B.PAS的函数(返回值为一个记录型的动态数组),在B.PAS中我把该记录申明成了全局的,在函数中动态分配该记录类型的数组.第一次返回可以显示,但当第二次调用该函数时却有Access violation at address 004891A8错误发生了.
DA : Array of ... ; 你要这样写了 setlength(DA,10)
//这文件包含了B.pasprocedure TForm1.Button1Click(Sender: TObject); var aaa:person; begin ... aaa:=tp.showperson();for i:=low(aaa) to high(aaa) do //第一次按时返回正常的,再按一次就错停在这里 begin showmessage(aaa[i].Name); end;//b.pas type rec_person=record name:string; age:integer; end; person=rec_person;function Tperson.Showperson():person; var indexofperson:integer; mperson:person; begin Setlength(mperson,0); indexofhistorylist:=0; SetLength(mperson,20); mperson[indexofperson].name:='jjj'; mperson[indexofperson].age:=20; inc(indexofhistorylist); Result:=mperson; end; //-----------------------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject); var d : Array of String ; i : Integer ; begin SetLength(d,10) ; for i := 0 to 9 do begin d[i] := IntToStr(i) ; ShowMessage(d[i]) ; end; SetLength(d,0) ; ShowMessage(Pchar(d)) ; end;没错呀
type rec_person=record name:string; age:integer; end;你不过定一个记录而已,name 字段以字符串来用可以吗 ?
我想我是错在把记录类型的动态数组申明成了全局的,会不会是因为我申明时的问题? type rec_person=record name:string; age:integer; end; person=rec_person; 是全局的,因为我试了,在另一个按钮中我又写了一样的代码,按了按钮一后,没错,按了按钮二就错了,而且错的地方也是老地方。
SetLength = 0
Access violation at address 004891A8
释放用 := nil
你要这样写了
setlength(DA,10)
var
aaa:person;
begin
...
aaa:=tp.showperson();for i:=low(aaa) to high(aaa) do //第一次按时返回正常的,再按一次就错停在这里
begin
showmessage(aaa[i].Name);
end;//b.pas
type
rec_person=record
name:string;
age:integer;
end;
person=rec_person;function Tperson.Showperson():person;
var
indexofperson:integer;
mperson:person;
begin
Setlength(mperson,0);
indexofhistorylist:=0;
SetLength(mperson,20);
mperson[indexofperson].name:='jjj';
mperson[indexofperson].age:=20;
inc(indexofhistorylist);
Result:=mperson;
end;
//-----------------------------------------------------------------
var
d : Array of String ;
i : Integer ;
begin
SetLength(d,10) ;
for i := 0 to 9 do
begin
d[i] := IntToStr(i) ;
ShowMessage(d[i]) ;
end;
SetLength(d,0) ;
ShowMessage(Pchar(d)) ;
end;没错呀
rec_person=record
name:string;
age:integer;
end;你不过定一个记录而已,name 字段以字符串来用可以吗 ?
type
rec_person=record
name:string;
age:integer;
end;
person=rec_person;
是全局的,因为我试了,在另一个按钮中我又写了一样的代码,按了按钮一后,没错,按了按钮二就错了,而且错的地方也是老地方。