PDA

View Full Version : خطای overflow (سرریز) شدن پشته سیستم



loknatesabz
یک شنبه 27 آذر 1390, 11:58 صبح
سلام
در حین اجرای برنامه با خطای overflow شدن پشته مواجه شدم برای برطرف کردن این خطا چی کار باید کرد؟ تورخدا هرکسی میدونه جواب بده.
ممنونم

secondstriker
یک شنبه 27 آذر 1390, 20:13 عصر
ممکن است ناشی از فراخوانی یک متد در داخل خودش باشد.
اگر توضیحات بیشتر می خواهی باید کدتو هم بنویسی.

loknatesabz
یک شنبه 27 آذر 1390, 21:24 عصر
این کدش هست. ارور برنامه توی تابع Partition هست. یعنی به شروع این تابع که میرسه این ارور رو میده.من تاحالا به همچین اروری برخورد نکردم. دوستان اگر میدونید ممنون میشم راهنماییم کنید.برای فردا میخوامش.
static int[] Sam;
static void Main(string[] args)
{
Console.WriteLine("Please enter a number for array cells.");
int n = Convert.ToInt32(Console.ReadLine());
Sam = new int [n];
for (int i = 0; i < n; i++)
{
Console.WriteLine(i +"omin cell is:");
Sam[i] = Convert.ToInt32(Console.ReadLine());
}
int low = 0;
int high = n;
int pivotpoint=0 ;
//for (pivotpoint = 0; pivotpoint < n; pivotpoint++)
Quick_Sort(low,high,pivotpoint);
Console.WriteLine(Sam);
Console.ReadLine();

}
static void Quick_Sort(int low, int high,int pivotpoint)
{

if (low < high)
{
Partition(low, high, pivotpoint);
Quick_Sort(low, pivotpoint - 1,pivotpoint);
Quick_Sort(pivotpoint + 1, high,pivotpoint);
}
}
static void Partition(int low, int high, int pivotpoint)
{

int j = 0;
int i = 0;
int tempSam = 0;
int pivotitem = Sam[low];

for (i = 1; i < high; i++)
if (Sam[i] > pivotitem)
{
j++;
tempSam = Sam[i];
Sam[i] = Sam[j];
Sam[j] = tempSam;
}

pivotpoint = j;
tempSam = Sam[low];
Sam[low] = Sam[pivotpoint];
Sam[pivotpoint] = tempSam;
}

emperor_vb6
دوشنبه 28 آذر 1390, 07:58 صبح
ببینید دوست عزیز من فقط علّت خطا را می گویم، علت خطای شما این است که در قطعه کد:
for (i = 1; i < high; i++)
if (Sam[i] > pivotitem)
{
j++;
tempSam = Sam[i];
Sam[i] = Sam[j];
Sam[j] = tempSam;
}هیچگاه از حلقه بیرون نخواهیم آمد. چون همیشه Sam[i] >pivotitem هست. بنابراین، دائما دو خانه بالای آرایه را جابجا می کند و این کار تا بینهایت ادامه خواهد داشت بنابراین خطای StackOverflowException (http://msdn.microsoft.com/en-us/library/system.stackoverflowexception.aspx) دریافت می کنید.
پیشنهاد میکنم الگوریتم خودتان را با الگوریتم بقیه (http://www.google.com/search?client=opera&rls=en&q=quick+sort+algorithm+in+c%23&sourceid=opera&ie=utf-8&oe=utf-8&channel=suggest)مقایسه کنید.

خب if كه حلقه نيست يك شرط يكبار انجام ميشه بعدشم بالاخره از حلقه for مياد بيرون!

secondstriker
دوشنبه 28 آذر 1390, 09:00 صبح
دوست عزیز اشکال برنامه شما همان است که گفتم.
static void Quick_Sort(int low, int high,int pivotpoint)
{

if (low < high)
{
Partition(low, high, pivotpoint);
Quick_Sort(low, pivotpoint - 1,pivotpoint);
Quick_Sort(pivotpoint + 1, high,pivotpoint);
}
}

چون داخل متد Quick_Sort باز هم از آن استفاده می کنید این اتفاق رخ می دهد. اگر این دو خط را cancel کنید اشکال بر طرف می شود!
الگوریتم خود را باید به گونه ای تغییر دهید که دیگر مجبور نشوید داخل یک متد از آن دوباره استفاده کنید.

loknatesabz
دوشنبه 28 آذر 1390, 09:41 صبح
سپاس بابت پیشنهادات همه ی دوستان و ممنونم که بررسی کردید.دستوری که بعد از حلقه for هست حداکثرn-2 بار اجرا میشه که این n رو ابتدای برنامه از کاربر میگیره(وقتی که حتی عدد کوچکی مثل 3 رو برای تعداد خونه های آرایه ام وارد میکنم همین پیغام داده میشه) از طرفی چون داده های ورودی آرایه از طرف کاربر مرتب نشده هستند ممکنه داده ها به ترتیب نزولی باشند پس خونه اول آرایه (Sam[low]) ممکن هست که بزرگترین عنصر آرایه باشه.من، فکر نمیکنم که این حلقه بی نهایت باشه. نمیدونم این استدلال درسته یا نه اگه اشتباهه لطفا راهنمایی کنید...
ایراد برنامه من توی تابع Partition بود. باکمی تغییر این ایراد برطرف شد.از همه دوستان ممنونم