Delphi xe3 vcl для проблемы с массивом firemonkey

При преобразовании из VCL в Firemonkey в Delphi у меня возникла следующая проблема: В VCL у меня есть следующий массив: Tcarray=array[1..$04000000] 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 прерывается со следующей ошибкой: «Проект FMtest.exe поднял класс исключений $ C00000FD с сообщением« переполнение стека в 0x00af69e7 ».


person Christo    schedule 21.05.2013    source источник
comment
Вам нужно отредактировать свой пост, чтобы добавить фактический код (полные объявления типа, код, который объявляет фактический массив и код, который его использует), а также точное сообщение об ошибке, которое вы получаете с исключением, для обеих версий кода, если вы хотите, чтобы мы помогли. Расплывчатого описания проблемы, вероятно, будет недостаточно, потому что то, что вы описываете, не должно происходить.   -  person Ken White    schedule 21.05.2013
comment
отредактировано по мере необходимости. спасибо   -  person Christo    schedule 22.05.2013


Ответы (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;
person RRUZ    schedule 22.05.2013