Delphi xe3 vcl到firemonkey数组问题

时间:2013-05-21 09:05:25

标签: delphi delphi-xe3 firemonkey-fm2

在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'。

1 个答案:

答案 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;