2011-03-31 9 views
5

Otrzymuję EStackOverflow podczas tworzenia zapakowany struct w Borland Delphi 7.0dostaję EStackOverflow błędzie podczas tworzenia zapakowany struct w Delphi 7.0

Chcę wykonać następujące czynności:

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; 

Ale kiedy Uruchomiłem program i kliknąłem przycisk, dostaję błąd EStackOverflow na linii begin z Button1Click.

Czy ktoś może mi pomóc?

+0

Naprawdę, po prostu to potwierdziłem (i zaktualizowałem nieco pytanie) – Blorgbeard

+1

@daemon Ta część jest nieszkodliwa, to tylko 4 + 1 bajty. Problemem są macierze o stałej wielkości. Są po prostu za duże. – CodesInChaos

+1

@daemon_x: w ogóle nie dotyka TT4, a to powinno być w każdym razie "sizeof (Pointer)" (tablica dynamiczna). – 0xC0000022L

Odpowiedz

12

Proste, utworzone elementy są zbyt duże dla domyślnego rozmiaru stosu. Albo zwiększ to przy tworzeniu wątku, albo przydziel pamięć do sterty. Tak czy inaczej działa.

Wystarczy zrobić matematyki na nim:

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

Spot na! Chociaż otrzymuję SizeOf (TTT) = 3646 * 27 * 27 = 2657934 = 2,5MB Domyślny Max Stack Size to tylko 1MB. :/ –

+0

jeśli SizeOf (T2) to 3646, SizeOf (TTT) powinno być 2657934, prawda? – jachguate

2

można częściowo rozwiązać ten problem poprzez zwiększenie rozmiaru stosu w opcjach projektu.

ale nie należy:

Nie twórz te ogromne struktury na stosie. Po to jest ta kupa, a nie stos.