2011-03-31 4 views
5

Ricevo un EStackOverflow durante la creazione di una struttura confezionato in Borland Delphi 7.0ottengo un'EStackOverflow errore durante la creazione struct confezionato in Delphi 7.0

voglio fare quanto segue:

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; 

Ma quando Eseguo il programma e faccio clic sul pulsante, viene visualizzato un errore EStackOverflow sulla riga begin di Button1Click.

Qualcuno può aiutarmi?

+0

Lo fa davvero, l'ho appena confermato (e aggiornato leggermente la domanda) – Blorgbeard

+1

@daemon Quella parte è innocua è solo 4 + 1 byte. Gli array di dimensioni costanti sono il problema. Sono semplicemente troppo grandi. – CodesInChaos

+1

@daemon_x: non tocca affatto TT4 e quell'espressione dovrebbe essere 'sizeof (Pointer)' comunque (array dinamico). – 0xC0000022L

risposta

12

Semplice, gli articoli creati sono troppo grandi per le dimensioni dello stack predefinite. Aumentalo quando crei il thread o alloca la memoria sull'heap. In entrambi i casi funziona.

Basta fare due conti su di esso:

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

Spot on! Anche se ottengo SizeOf (TTT) = 3646 * 27 * 27 = 2657934 = 2,5 MB La dimensione massima dello stack predefinito è solo 1 MB. :/ –

+0

se SizeOf (T2) è 3646, SizeOf (TTT) dovrebbe essere 2657934, giusto? – jachguate

2

Si può parzialmente risolvere questo problema aumentando la dimensione dello stack nelle opzioni di progetto.

Ma non si dovrebbe:

Non creare quelle enormi strutture in pila. Ecco a cosa serve l'heap, non lo stack.