نمایش نتایج 1 تا 4 از 4

نام تاپیک: مشکل فراخوانی زیاد و خطای stack overflow exeption

  1. #1

    مشکل فراخوانی زیاد و خطای stack overflow exeption

    سلام
    متأسفانه در کدنویسی مجبورم داخل یک فرم بیش از چند هزار خط فراخوانی از فرم دیگر رو داشته باشم که باعث خطای stack overflow exeption میشه، وقتی تعداد خط های فراخوانی رو کم میکنم خطا برطرف میشه، لطفا راهنمایی کنید چه راه دیگه ای وجود داره که فراخوانی فرم دیگه انجام بشه ولی خطای stack نیاد.
    تشکر

  2. #2
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: مشکل فراخوانی زیاد و خطای stack overflow exeption

    به نظر من این مشکل احتمالا به دلیل ایجاد حلقه‌های بازگشتی در کد شما است که باعث ایجاد خطای stack overflow exeption می‌شوند. برای رفع احتمالی این مشکل :
    1- استفاده از حلقه‌های بازگشتی با شرط خروج از حلقه
    2- استفاده از توابع دستوری به جای حلقه‌های بازگشتی
    3- محدود کردن تعداد فراخوانی‌ها با استفاده از شرط‌ های مناسب
    4- بهینه سازی کدهای تکراری و استفاده از توابع کم حجم و با قابلیت استفاده مجدد
    این موارد نظرات شخصی من هست ولی اساتید قطعا راه کارهای بهتری ارائه می دهند .

    Private Sub RecursiveFunction(ByVal n As Integer, ByVal maxDepth As Integer, ByVal currentDepth As Integer)
    If n > 0 AndAlso currentDepth <= maxDepth Then
    RecursiveFunction(n - 1, maxDepth, currentDepth + 1)
    Console.WriteLine(n)
    End If
    End Sub


    در این کد، تابع RecursiveFunction با سه پارامتر ورودی تعریف شده است. پارامتر اول : n در کد فوق مشخص می‌کند که از چه عددی شروع به چاپ کردن اعداد به صورت نزولی (یک تا n ) کنیم . به عبارت دیگر، این پارامتر تعداد اعدادی را که می‌خواهیم چاپ کنیم تعیین می‌کند.
    پارامتر دوم : (maxDepth) در کد فوق مشخص می‌کند که چه تعداد حداکثر فراخوانی از تابع مجاز است. به عبارت دیگر، این پارامتر تعداد حداکثر را مشخص می‌کند تا از خطای stack overflow exeption جلوگیری کنیم
    پارامتر سوم : (currentDepth) در کد فوق تعداد فراخوانی‌های فعلی تابع RecursiveFunction را نگه می دارد .این پارامتر در شرط بستن حلقه استفاده می‌شود تا از خطای stack overflow exeption جلوگیری کنیم
    در این حلقه اگر عدد به 1000 برسد حلقه بسته میشود

    برای فراخوانی این تابع، می‌توانید به صورت زیر عمل کنید

    RecursiveFunction(10, 1000, 0)
    آخرین ویرایش به وسیله پرستو پارسایی : دوشنبه 25 اردیبهشت 1402 در 17:35 عصر

  3. #3

    نقل قول: مشکل فراخوانی زیاد و خطای stack overflow exeption

    نقل قول نوشته شده توسط پرستو پارسایی مشاهده تاپیک
    به نظر من این مشکل احتمالا به دلیل ایجاد حلقه‌های بازگشتی در کد شما است که باعث ایجاد خطای stack overflow exeption می‌شوند. برای رفع احتمالی این مشکل :
    1- استفاده از حلقه‌های بازگشتی با شرط خروج از حلقه
    2- استفاده از توابع دستوری به جای حلقه‌های بازگشتی
    3- محدود کردن تعداد فراخوانی‌ها با استفاده از شرط‌ های مناسب
    4- بهینه سازی کدهای تکراری و استفاده از توابع کم حجم و با قابلیت استفاده مجدد
    این موارد نظرات شخصی من هست ولی اساتید قطعا راه کارهای بهتری ارائه می دهند .

    Private Sub RecursiveFunction(ByVal n As Integer, ByVal maxDepth As Integer, ByVal currentDepth As Integer)
    If n > 0 AndAlso currentDepth <= maxDepth Then
    RecursiveFunction(n - 1, maxDepth, currentDepth + 1)
    Console.WriteLine(n)
    End If
    End Sub


    در این کد، تابع RecursiveFunction با سه پارامتر ورودی تعریف شده است. پارامتر اول : n در کد فوق مشخص می‌کند که از چه عددی شروع به چاپ کردن اعداد به صورت نزولی (یک تا n ) کنیم . به عبارت دیگر، این پارامتر تعداد اعدادی را که می‌خواهیم چاپ کنیم تعیین می‌کند.
    پارامتر دوم : (maxDepth) در کد فوق مشخص می‌کند که چه تعداد حداکثر فراخوانی از تابع مجاز است. به عبارت دیگر، این پارامتر تعداد حداکثر را مشخص می‌کند تا از خطای stack overflow exeption جلوگیری کنیم
    پارامتر سوم : (currentDepth) در کد فوق تعداد فراخوانی‌های فعلی تابع RecursiveFunction را نگه می دارد .این پارامتر در شرط بستن حلقه استفاده می‌شود تا از خطای stack overflow exeption جلوگیری کنیم
    در این حلقه اگر عدد به 1000 برسد حلقه بسته میشود

    برای فراخوانی این تابع، می‌توانید به صورت زیر عمل کنید

    RecursiveFunction(10, 1000, 0)
    سلام، ممنون از وقتی که گذاشتید و جواب دادید، کد من خیلی محاسباتی نیست که نیاز باشه به این صورت عمل بشه، فقط یسری اعمال گرافیکی(تغییر رنگ خطوط و ایمیج باکس و....) هست، راه حلی هست که دستور بدم از یه فرم دیگه ،مثلا خط 30 تا 250 اجرا بشه، دیگه نیاز نباشه اون حدود 220 خط رو یکی یکی وارد کد (فراخوانی) کنم.
    مثلا تو حالت عادی برای فراخوانی مینویسم form260.line55.forecolor=color.red و از این فراخوانی ها چند هزار خط با شروط مختلف استفاده شده‌. ممنون از شما
    آخرین ویرایش به وسیله Mahdi.21267 : دوشنبه 25 اردیبهشت 1402 در 23:00 عصر

  4. #4
    کاربر دائمی آواتار پرستو پارسایی
    تاریخ عضویت
    آبان 1392
    محل زندگی
    تهران
    پست
    458

    نقل قول: مشکل فراخوانی زیاد و خطای stack overflow exeption

    در این مثال، تابع ApplyChanges تمام تغییرات گرافیکی را انجام می‌دهد و سپس با مقدار عمق بعدی فراخوانی می‌شود. در هر بار فراخوانی، مقدار عمق چک می‌شود و اگر بیشتر یا مساوی حداکثر عمق مجاز بود، تابع متوقف می‌شود. در غیر این صورت، تغییرات گرافیکی اعمال می‌شود و تابع با مقدار عمق بعدی فراخوانی می‌شود.

    با استفاده از این روش، نیازی به وارد کردن هزاران فراخوانی در کد نیست و تمام تغییرات گرافیکی در یک تابع قرار دارد.


    Private Sub ApplyChanges(ByVal depth As Integer)
    If depth >= MAX_DEPTH Then
    Return
    End If

    ' اعمال تغییرات گرافیکی
    form260.line55.ForeColor = Color.Red
    '...

    ' فراخوانی تابع با مقدار عمق بعدی
    ApplyChanges(depth + 1)
    End Sub


    Private Const MAX_DEPTH As Integer = 10


    Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs)
    ' شروع اجرای تابع با عمق اولیه ۰
    ApplyChanges(0)
    End Sub

تاپیک های مشابه

  1. راه مقابله با stack overflow چیه؟
    نوشته شده توسط sha8046 در بخش C#‎‎
    پاسخ: 5
    آخرین پست: سه شنبه 29 فروردین 1391, 13:56 عصر
  2. stack overflow
    نوشته شده توسط theinfinity در بخش برنامه نویسی اسمبلی خانواده x86
    پاسخ: 3
    آخرین پست: یک شنبه 09 خرداد 1389, 09:39 صبح
  3. Stack OverFlow
    نوشته شده توسط gheisari در بخش مباحث عمومی دلفی و پاسکال
    پاسخ: 5
    آخرین پست: دوشنبه 07 اسفند 1385, 13:02 عصر
  4. علت خطای stack overflow در کد زیر
    نوشته شده توسط احمد در بخش برنامه نویسی در Delphi
    پاسخ: 2
    آخرین پست: جمعه 07 آذر 1382, 20:39 عصر

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •