Delphi xe3 vcl для выпуска массива firemonkey
При преобразовании из VCL в Firemonkey в Delphi у меня возникает следующая проблема: В VCL у меня есть следующий массив: Tcarray=array[1..$04000000] of Tcoordinate; - Это отлично работает.
Однако, объявляя тот же массив в 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 ответ
Это переполнение стека происходит потому, что вы создаете очень большую локальную переменную 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;