2011-03-31 1 views
5

Borland Delphiの7.0パックされた構造体を作成するときに、私はDelphiでエラーEStackOverflowを得る7.0

をパック構造体を作成するときに、私は次の操作を実行したいEStackOverflowを取得しています:

Type 

T4 = packed record 
    VT : integer; 
    SKT : byte; 
    end; 

    T3 = packed record 
    O : boolean;  
    TT4 : array of T4; 
    end; 

    T2 = packed record 
    con : boolean; 
    TT3 : array [64..90,64..90] of T3; 
    End; 

    TTT = array [64..90,64..90] of T2; 


procedure TForm1.Button1Click(Sender: TObject); 
var 
    Arr : TTT; 
begin 
     Arr[64,64].con:=false; 
end; 

しかしときプログラムを実行してボタンをクリックすると、Button1Clickbegin行にEStackOverflowエラーが表示されます。

誰かが私を助けることができますか?

+0

本当に、私はそれを確認しました(少し質問を更新しました) – Blorgbeard

+1

@daemonその部分は無害です。ちょうど4 + 1バイトです。一定の大きさの配列が問題です。彼らは単に大きすぎます。 – CodesInChaos

+1

@daemon_x:彼はTT4に全く触れておらず、その表現はとにかく(サイズ配列(ポインタ))でなければなりません。 – 0xC0000022L

答えて

12

シンプルに、作成されたアイテムはデフォルトのスタックサイズには大きすぎます。スレッドを作成するときに増加させるか、ヒープ上にメモリを割り当てます。どちらの方法でも動作します。

はちょうどそれに数学の操作を行います。

sizeof(T4) = 5 
sizeof(T3) = 5 
sizeof(T2) = 3646 // if I'm right 
sizeof(TTT)= 2657934 
+0

Spot on!私はSizeOf(TTT)= 3646 * 27 * 27 = 2657934 = 2.5MBを取得しますが、デフォルトの最大スタックサイズはわずか1MBです。 :/ –

+0

SizeOf(T2)が3646の場合、SizeOf(TTT)は2657934でなければなりません。 – jachguate

2

あなたは部分的にあなたのプロジェクトオプションであなたのスタックサイズを増やすことでこの問題を解決することができます。

しかし、あなたはいけない:

は、スタック上のそれらの巨大な構造体を作成しないでください。これはスタックではなくヒープのためのものです。

関連する問題