在Delphi中从VCL转换为Firemonkey时,我遇到以下问题: 在VCL中,我有以下数组: Tcarray = Tcoordinate的数组[1 .. $ 04000000]; - 这很好。
但是,在Firemonkey中声明相同的数组我得到一个关于0x00处堆栈溢出的异常。 到目前为止,我唯一的解决方案是将数组最小化为[1..40000]。
这是为什么?有解决方案吗
VCL代码如下
unit ptypes;
interface
uses windows,vcl.Graphics,Vcl.Imaging.jpeg,Vcl.Imaging.GIFImg,system.Types;
type
Tcoordinate=packed record
x,y:double;
end;
Tcarray=array[1..$04000000] of Tcoordinate;
Tpoly=packed record
n:longint;
c:Tcarray;
end;
它会像这样调用:
procedure TForm12.Button2Click(Sender: TObject);
var
poly:Tpoly;
begin
with poly do
begin
c[1].x:=100; c[1].y:=100;
c[2].x:=400; c[2].y:=100;
c[3].x:=400; c[3].y:=400;
c[4].x:=250; c[4].y:=550;
c[5].x:=100; c[5].y:=400;
n:=5;
end;
这在VCL中可以正常工作但在FM中会出现以下错误:“Project FMtest.exe引发了异常类$ C00000FD,消息'堆栈溢出为0x00af69e7'。
答案 0 :(得分:2)
发生此堆栈溢出是因为您正在创建一个非常大的局部变量poly
(1.073.741.828字节),并且堆栈(存储局部变量的位置)的大小有限。
您可以避免此问题以这种方式重新声明您的类型
PCArray=^Tcarray;
Tcarray=array[1..$04000000] of Tcoordinate;
Tpoly=packed record
n:longint;
c:PCArray;
end;
并使用如此
var
poly : Tpoly; //now poly only uses 8 bytes of the stack space
points : integer;
begin
points:=5;
GetMem(poly.c,sizeof(Tcoordinate)*points);
try
with poly do
begin
c[1].x:=100; c[1].y:=100;
c[2].x:=400; c[2].y:=100;
c[3].x:=400; c[3].y:=400;
c[4].x:=250; c[4].y:=550;
c[5].x:=100; c[5].y:=400;
n:=points;
end;
finally
FreeMem(poly.c);
end;
end;