记录类型动态数组的实参传递传不了,望高手指教 ( 积分: 100 )

  • 主题发起人 主题发起人 chzi826
  • 开始时间 开始时间
C

chzi826

Unregistered / Unconfirmed
GUEST, unregistred user!
type Taa=Record
a:integer;
b:string;
End;

procedure f(var aa:array of Taa);
var i:integer;
begin
for i:=0 to length(aa)-1 do aa.a:=1;
end;

procedure click;
var c1,c2,c3:Ta;
begin
f([c1,c2,c3]);
end;

这样会报"Constant object cannot be passed as var parameter",如果把f函数里的var去掉就能正常执行

我的想法大概是这样的:
开始是定义好 c1,c2,c3,c4:Taa ,Taa是个比较复杂的记录类型
然后在传参时是有选择性的,比如f([c1,c3])或f([c2,c3,c4]),由f函数来给传进来的Taa类型赋值
如果这种写法不行的话,是不是可以用指针,用指针的话能解决吗?该怎样做?
 
两种方式
procedure click;
var
c1,c2,c3:Taa;
AC: array[0..2] of Taa;
BC: array of Taa;
begin
AC[0] := c1;
AC[1] := C2;
AC[2] := C3;
f(AC);
SetLength(BC, 3);
BC[0] := C1;
BC[1] := C2;
BC[2] := C3;
F(BC);
//f([c1,c2,c3]);
end;
 
type Taa=Record
a:integer;
b:string;
End;
TAAs = array of TAA;
procedure f(var aa:TAAs);
....
procedure click;
var
aas:Taas;
begin
setlength(aas, 3);
f(aas);
end;
 
type Taa=Record
a:integer;
b:string;
End;

procedure f(var aa:array of Taa);
var i:integer;
begin
for i:=0 to length(aa)-1 do aa.a:=1;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
c1,c2,c3:Taa;
temp: array of Taa;
begin
c1.a:= 2;
SetLength(temp,sizeOf(Taa)*3);
temp[0]:= c1;
temp[1]:= c2;
temp[2]:= c3;
f(temp);
showmessage(inttostr(temp[0].a));
end;

procedure TForm1.Button2Click(Sender: TObject);
procedure f2(var aa: Taa);
begin
aa.a:= 3;
end;
var
c1: Taa;
begin
c1.a:= 2;
f2(c1);
showmessage(inttostr(c1.a));
end;
 
to ANiDelphi,那年黄梅花开
按你们做的话,我传实参好像就没有意义了

to wr960204
这样做虽然能解决问题,但还是不太合适

我的想法大概是这样的:
开始是定义好 c1,c2,c3,c4:Taa ,Taa是个比较复杂的记录类型
然后在传参时是有选择性的,比如f([c1,c3])或f([c2,c3,c4]),由f函数来给传进来的Taa类型赋值
如果这种写法不行的话,是不是可以用指针,用指针的话能解决吗?该怎样做?
 
是的,用指针十分方便
type
PTaa = ^Taa;
Taa=Record
a:integer;
b:string;
End;

procedure f(aa:array of PTaa);
var i:integer;
begin
for i:=0 to length(aa)-1 do aa.a:=1;
end;

procedure click;
var c1,c2,c3:PTaa;
begin

c1 := new(Ptaa);
c2 := new(Ptaa);
c3 := new(Ptaa);
try
showmessage(inttostr(c1.a));

f([c1,c2,c3]);

showmessage(inttostr(c1.a)) ;
finally
Dispose(c1);
Dispose(c2);
Dispose(c3);
end;
end;
 
谢啦,zhuangqr
 
已经解决,依据zhuangqr的回复改了一下
type Taa=Record
a:integer;
b:string;
End;
T=^Taa;

procedure f(var aa:array of T);
var i:integer;
begin
for i:=0 to length(aa)-1 do aa.a:=1;
end;

procedure click;
var c1,c2,c3:Taa;
begin
f([@c1,@c2,@c3]);
end;
 
后退
顶部