动态数组. ( 积分: 10 )

  • 主题发起人 主题发起人 bigroute
  • 开始时间 开始时间
B

bigroute

Unregistered / Unconfirmed
GUEST, unregistred user!
procedure Test(Data: array of single);
var
FData :array of single;
begin
两个问题.
//怎么能使FData 引用Data,

//怎么能 把Data的数据拷贝到FData里,不要循环,有没有更快的方法.

end;
 
procedure Test(Data: array of single);
var
FData :array of single;
begin
两个问题.
//怎么能使FData 引用Data,

//怎么能 把Data的数据拷贝到FData里,不要循环,有没有更快的方法.

end;
 
setlength(FData,Length(Data));//设定长度
 
for i:=low(Fdata) to High(fdata) do
begin
fdata:=data
end;
 
内存拷贝
 
如果只是引用的话,可以强制转换。
procedure test(x: array of double);
var
tx: array of double;
begin
asm
push x
pop tx
end;
showmessage(floattostr(tx[2]));
tx := nil;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
test([12.3,312.312,1231.123]);
end;
如果要复制的话,可以这样:
procedure test(x: array of double);
var
tx: array of double;
l: integer;
begin
l := high(x)-low(x) + 1;
setlength(tx, l);
copymemory(tx,pointer(@x),l*sizeof(double));
showmessage(floattostr(tx[2]));
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
test([12,3.1231,1231.12]);
end;
 
asm
push x
pop tx
end;

这个可不可以换成其它方式?
 
那样写最简单
tx := pointer(@x);
也行
 
引用:
setlength(FData,Length(Data));//设定长度
FData :=Data;

拷贝:
FData:=Copy(Data);或FData:=Copy(Data,从第几个开始拷贝,拷贝几个);
 
[Error] Unit1.pas(33): Incompatible types: 'Array' and 'dynamic array'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'


[Error] Unit1.pas(32): Incompatible types
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

不会就不要乱贴,试一下代码再回贴.
 
type
TP=Data: array of single;
procedure Test(Data:TP);
var
FData :TP;
begin
两个问题.
//怎么能使FData 引用Data,????什么意思???

//怎么能 把Data的数据拷贝到FData里,不要循环,有没有更快的方法.
FData:=Data;
end;
 
[:)][:D][:(!][^][^][^][^][?]
 
=^0^=
注意:
1、由于 Delphi 中动态数组的实现其事与 string 的类似,记录了长度和引用次数等信息,使用 Pointer(FData) := @Data[Low(Data)] 强制指定引用而没有处理相关长度、引用次数等是有问题的。
2、使用 Move 赋值是最快的。

procedure Test(Data: array of single);
var
I: Integer;
FData: array of single;
begin
// 怎么能使FData 引用Data,

Pointer(FData) := @Data[Low(Data)];
for I := Low(Data) to High(Data) do
ShowMessage(FloatToStr(FData));
Pointer(FData) := nil;

//怎么能 把Data的数据拷贝到FData里,不要循环,有没有更快的方法.

SetLength(FData, Length(Data));
Move(Data[Low(Data)], Pointer(FData)^, Length(Data) * SizeOf(Single));

for I := Low(FData) to High(FData) do
ShowMessage(FloatToStr(FData));
end;
 
LSUPER,
Pointer(FData) := nil;
是正确地,
我写的
tx := nil;
是不对的,这样会将原来的array释放掉
 
接受答案了.
 

Similar threads

S
回复
0
查看
685
SUNSTONE的Delphi笔记
S
S
回复
0
查看
645
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部