PDA

View Full Version : استفاده از Array و خطای Stack over flow



عقاب سیاه
پنج شنبه 24 دی 1388, 12:38 عصر
سلام
ببخشید من هنگام استفاده از Array هایی مثل مثال زیر با خطای Stack over flow مواجه می شودم! امکان کوتاه کردن این Array ها نیز وجود ندارد لطفا راهنمایی کنید.:گریه:
of Integer;"]

دلفــي
پنج شنبه 24 دی 1388, 12:57 عصر
سلام
ببخشید من هنگام استفاده از Array هایی مثل مثال زیر با خطای Stack over flow مواجه می شودم! امکان کوتاه کردن این Array ها نیز وجود ندارد لطفا راهنمایی کنید.:گریه:


من كه مثالي نمي بينم !!!

عقاب سیاه
پنج شنبه 24 دی 1388, 14:03 عصر
ببخشید یادم رفت در ضمن هرچه محدوده Array از این تعداد(محدوده زیر) بیش تر بشه این پیغام را میده اما با این مقدار کنمتر مشکلی نداره(مثلا 5 رقمی)

Var
Rand : Array[100000..1000000] of Integer;

دلفــي
پنج شنبه 24 دی 1388, 14:47 عصر
اين خطا هنگام سرريز شدن پشته روي مي دهد ، شما مي توانيد براي جلوگيري از اين امر به روش زير عمل كنيد :



var
Form1: TForm1;
type
PBigArray = ^TBigArray;
{$IFDEF WIN32}
TBigArray = array[0..10000000] of byte;
{$ELSE}
TBigArray = array[0..64000] of byte;
{$ENDIF}
implementation
{$R *.dfm}
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Rand : PBigArray;
begin
GetMem(Rand, sizeof(Rand^));
Rand^[0] := 10;
FreeMem(Rand, sizeof(Rand^));
end;

vcldeveloper
پنج شنبه 24 دی 1388, 17:41 عصر
بخشید من هنگام استفاده از Array هایی مثل مثال زیر با خطای Stack over flow مواجه می شودم!
آرایه رو دارید در داخل یک تابع یا Procedure تعریف می کنید، و به خاطر بزرگی آن، پشته پر میشه:
1- آرایه را خارج از تابع، به صورت یک متغیر عمومی، یا یک فیلد کلاس تعریف کنید.
2- یا اندازه پشته در برنامه را با استفاده از Compiler Directive مربوطه، افزایش بدید.


شما می توانید برای جلوگیری از این امر به روش زیر عمل کنید
اون کد دیگه از پشته استفاده نمیکنه، و خودش یک ساختار روی Heap ایجاد میکنه. اگر قرار هست همچین کاری انجام بشه، استفاده از Dynamic Array بهتر هست و دردسر کمتری هم داره، Dynamic Array روی Heap ایجاد میشه، و مدیریت حافظه آن هم خودکار هست.

عقاب سیاه
پنج شنبه 24 دی 1388, 18:17 عصر
سلام خیلی ممنونم که پاسخ دادید:تشویق:

- یا اندازه پشته در برنامه را با استفاده از Compiler Directive مربوطه، افزایش بدید.
می شود کمی توضیح بدهید!در مورد بالا!

vcldeveloper
جمعه 25 دی 1388, 01:21 صبح
می شود کمی توضیح بدهید!در مورد بالا! چک کردم، دیدم توی Project Options هم گزینه اش وجود داره؛ در Project Options صفحه مربوط به Linker را پیدا کنید، و مقدار Maximum Stack Size را افزایش بدید.

البته همانطور که گفتم، بهتر هست که به جای اینکه آرایه را در داخل تابع به اون شکل تعریف کنید، از یک Dynamic Array استفاده کنید که روی Heap مقداردهی میشه، و این مسائل مربوط به Stack را نداره.