2011-03-31 9 views
5

tôi nhận được một EStackOverflow khi tạo một cấu trúc đóng gói trong Borland Delphi 7.0tôi nhận được một EStackOverflow lỗi khi tạo struct đóng gói trong delphi 7.0

Tôi muốn làm như sau:

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; 

Nhưng khi Tôi chạy chương trình và nhấp vào nút, tôi gặp lỗi EStackOverflow trên đường dây begin của Button1Click.

Ai đó có thể giúp tôi không?

+0

Thực sự, tôi vừa xác nhận nó (và cập nhật câu hỏi một chút) – Blorgbeard

+1

@daemon Phần đó vô hại chỉ là 4 + 1 byte. Các mảng có kích thước không đổi là vấn đề. Chúng đơn giản là quá lớn. – CodesInChaos

+1

@daemon_x: anh ấy không chạm vào TT4 chút nào và biểu thức đó phải là 'sizeof (Pointer)' anyway (mảng động). – 0xC0000022L

Trả lời

12

Đơn giản, các mục được tạo quá lớn đối với kích thước ngăn xếp mặc định. Hoặc là tăng khi tạo chuỗi hoặc cấp phát bộ nhớ trên heap. Dù bằng cách nào cũng hiệu quả.

Chỉ cần làm phép tính trên đó:

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

Phát ngay! Mặc dù tôi nhận được SizeOf (TTT) = 3646 * 27 * 27 = 2657934 = 2.5MB Kích thước ngăn xếp tối đa mặc định chỉ là 1MB. :/ –

+0

nếu SizeOf (T2) là 3646, SizeOf (TTT) phải là 2657934, phải không? – jachguate

2

Bạn có thể giải quyết một phần này bằng cách tăng kích thước ngăn xếp của bạn trong lựa chọn dự án của bạn.

Nhưng bạn không nên:

Không tạo những cấu trúc khổng lồ đó trên ngăn xếp. Đó là những gì heap là cho, không phải là ngăn xếp.