2013-05-21 3 views
0

Delphi에서 VCL에서 Firemonkey로 변환 할 때 다음과 같은 문제가 발생합니다. VCL에서 다음 배열을 사용합니다. Tcarray = array [1. .. $ 04000000] of Tcoordinate; - 괜찮아.firemonkey 배열 문제에 대한 Delphi xe3 vcl

그러나 Firemonkey에서 같은 배열을 선언하면 0x00에서 스택 오버플로에 대한 예외가 발생합니다. 내 유일한 솔루션은 [1..40000] 배열을 최소화하는 것입니다.

왜 이런가요? 어떤 해결책?

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을

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; 

그것은 다음과 같이 호출됩니다를 따를 때

VCL 코드입니다. exe 예외 클래스 $ C00000FD '0x00af69e7 때 스택 오버플로'발생했습니다.

+0

처럼 사용할 수있는 [편집] 실제 코드 (전체 선언을 추가하는 게시물 형식, 실제 배열을 선언하는 코드 및이를 사용하는 코드)와 예외가 발생하는 정확한 오류 메시지가 함께 표시됩니다. 당신이 묘사하고있는 것이 일어나서는 안되기 때문에 문제에 대한 막연한 설명은 아마도 충분하지 않을 것입니다. –

+0

은 필요에 따라 편집되었습니다. 고맙습니다. – Christo

답변

2

이 스택 오버플로는 매우 큰 로컬 변수를 만들므로 발생합니다 poly (of 1.073.741.828 바이트)와 스택 (로컬 변수가 저장되는 장소)의 크기가 제한되어 있습니다.

당신은이 방법

PCArray=^Tcarray; 
Tcarray=array[1..$04000000] of Tcoordinate; 


Tpoly=packed record 
    n:longint; 
    c:PCArray; 
end; 

에서 유형을 redeclarating이 문제를 방지하고 당신이 필요하므로

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;