اطلاعیه

Collapse
No announcement yet.

فراخوانی توابع در C

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    فراخوانی توابع در C

    سلام
    یک سوال برام پیش اومد گفتم اینجا مطرح کنم بهتره:
    اگه 2 تا تابع داشته باشید (FunA , FunB) و از FunA بخواهیم FunB را فراخوان کنیم ، برای بازگشت از return استفاده میکنیم (یا اینکه تایع کاملاً اجرا بشه)؛ مثل:
    کد:
    void FunA (void)
    {
    uint8_t A;
    uint8_t B;
    ....
    FunB();
    ....
    }
    
    void FunB (void)
    {
    uint8_t D;
    uint8_t E;
    ...
    return;
    }
    حالا اگه به شکل زیر اجرا کنیم :
    کد:
    void FunA (void)
    {
    uint8_t A;
    uint8_t B;
    ....
    FunB();
    ....
    }
    
    void FunB (void)
    {
    uint8_t D;
    uint8_t E;
    ...
    FunA();
    }
    یعنی به هر دلیلی تابع قبلی را فراخوان کنیم ، چه اتفاقی برای RAM سیستم بدلیل وجود متغیر های محلی میافته؟
    آیا مجدداً براشون حافظه تخصیص میده و RAM را بیهوده اشغال میکنه و یا اینکه جایگزین قبلی ها میشه ؟؟؟
    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

    #2
    پاسخ : فراخوانی توابع در C

    سلام همشهری
    :-?
    به نظر من نوشتن کد دومی که نوشتی مثل این هست که این جمله را بنویسی
    کد:
    if(a=10)b=100;
    درسته که برنامه بالا اجرا میشه و اروری داده نمیشه ولی در عمل همه چیز را خراب خواهد کرد.
    برنامه ی دوم هم همینطور هست.

    دیدگاه


      #3
      پاسخ : فراخوانی توابع در C

      در برنامه اولی تابع B رو قبل از A بنویس و return رو حذف کن.

      دیدگاه


        #4
        پاسخ : فراخوانی توابع در C

        * ب هر بار فراخوانی مجددا برای متغیرها حافظه تخصیص داده میشه
        * با پر شدن پشته رفتار برنامه غیر قابل پیش بینی میشه

        دیدگاه


          #5
          پاسخ : فراخوانی توابع در C

          نوشته اصلی توسط Abbas Sarami
          سلام
          یک سوال برام پیش اومد گفتم اینجا مطرح کنم بهتره:
          اگه 2 تا تابع داشته باشید (FunA , FunB) و از FunA بخواهیم FunB را فراخوان کنیم ، برای بازگشت از return استفاده میکنیم (یا اینکه تایع کاملاً اجرا بشه)؛ مثل:
          کد:
          void FunA (void)
          {
          uint8_t A;
          uint8_t B;
          ....
          FunB();
          ....
          }
          
          void FunB (void)
          {
          uint8_t D;
          uint8_t E;
          ...
          return;
          }
          حالا اگه به شکل زیر اجرا کنیم :
          کد:
          void FunA (void)
          {
          uint8_t A;
          uint8_t B;
          ....
          FunB();
          ....
          }
          
          void FunB (void)
          {
          uint8_t D;
          uint8_t E;
          ...
          FunA();
          }
          یعنی به هر دلیلی تابع قبلی را فراخوان کنیم ، چه اتفاقی برای RAM سیستم بدلیل وجود متغیر های محلی میافته؟
          آیا مجدداً براشون حافظه تخصیص میده و RAM را بیهوده اشغال میکنه و یا اینکه جایگزین قبلی ها میشه ؟؟؟
          با هر بار فراخوانی روی پشته شما برای متغیرهای محلی حافظه جدیدی درست میشه برای همین هم چیزی خراب نمیشه اما اینی که شما نوشتی خرابکاری میکنه چون اینقدر دو تابع هم دیگر رو صدا میزنن که در نهایت پشته شما پر میشه و سیستم عامل برنامه تون رو میبنده.
          شما بالاخره یک جا باید این زنجیره فراخوانی بازگشتی رو بشکنید.

          دوم این که اختصاص حافظه جدید بیهوده نیست. ببینید بعضی الگوریتم ها به صورت بازگشتی کار میکنند. یعنی یک تابع خودش رو مرتب فراخونی میکنه (مثلا ۵۰) بار ولی در هر بار فراخوانی متغیر ارسال شده فرق میکنه. در اینجا نباید در هر بار فراخوانی متغیرهای محلی از بین برند برای همین هم سی متغیرها رو هربرا ذخیره میکنه تا وقتی یک تابع برگشت تابعی که اون رو فراخونی کرده بود متغیرهاش سالم و دست نخورده باشند.

          یک چیزی هم یادم رفت بگم. وقتی شما خروجی تابعتون رو void تعریف کردید نباید براش return بذارید. کامپایلر ارور میگیره و برنامه رو کامپایل نمیکنه.

          دیدگاه


            #6
            پاسخ : فراخوانی توابع در C

            خیلی ممنون از دوستان بابت پاسخ ها

            ----------------------------
            اما اینی که شما نوشتی خرابکاری میکنه چون اینقدر دو تابع هم دیگر رو صدا میزنن که در نهایت پشته شما پر میشه و سیستم عامل برنامه تون رو میبنده.
            من سوالم این بود که با فراخوانی مجدد تابع حافظه جدید تخصیص میده که دوستان گفتند تخصیص میده ؛ شاید مثالم درست نبود :mrgreen:

            یک چیزی هم یادم رفت بگم. وقتی شما خروجی تابعتون رو void تعریف کردید نباید براش return بذارید. کامپایلر ارور میگیره و برنامه رو کامپایل نمیکنه.
            دیگه اینقده ناشی نیستم :mrgreen:
            این که return مقدار نیست ؛ این دستور باعث میشه که هرجایی از تابع باشید از اون تابع خارج بشه.
            حرف شما موقعی صدق میکنه که من نوشته باشم return x

            باز هم تشکر میکنم از همه

            امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است

            دیدگاه


              #7
              پاسخ : فراخوانی توابع در C

              نوشته اصلی توسط Abbas Sarami
              خیلی ممنون از دوستان بابت پاسخ ها

              ----------------------------من سوالم این بود که با فراخوانی مجدد تابع حافظه جدید تخصیص میده که دوستان گفتند تخصیص میده ؛ شاید مثالم درست نبود :mrgreen:
              دیگه اینقده ناشی نیستم :mrgreen:
              این که return مقدار نیست ؛ این دستور باعث میشه که هرجایی از تابع باشید از اون تابع خارج بشه.
              حرف شما موقعی صدق میکنه که من نوشته باشم return x

              باز هم تشکر میکنم از همه
              چه جالب
              من این قسمت دومی که شما نوشتید (return) رو نمیدونستم.

              دیدگاه

              لطفا صبر کنید...
              X