ورود به حساب ثبت نام جدید فراموشی کلمه عبور
برای ورود به حساب کاربری خود، نام کاربری و کلمه عبورتان را در زیر وارد کرده و روی «ورود به سایت» کلیک کنید.





اگر فرم ورود برای شما نمایش داده نمیشود، اینجا را کلیک کنید.









اگر فرم ثبت نام برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.









اگر فرم بازیابی کلمه عبور برای شما نمایش داده نمی‌شود، اینجا را کلیک کنید.





کاربران برچسب زده شده

نمایش نتایج: از 1 به 7 از 7
  1. #1
    2008/07/03
    865
    26

    فراخواني توابع در 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. #2
    2008/02/19
    2,296
    38

    پاسخ : فراخواني توابع در C

    سلام همشهري
    :-?
    به نظر من نوشتن كد دومي كه نوشتي مثل اين هست كه اين جمله را بنويسي
    کد:
    if(a=10)b=100;
    درسته كه برنامه بالا اجرا ميشه و اروري داده نميشه ولي در عمل همه چيز را خراب خواهد كرد.
    برنامه ي دوم هم همينطور هست.
  3. #3
    2012/01/20
    364
    19

    پاسخ : فراخواني توابع در C

    در برنامه اولی تابع B رو قبل از A بنویس و return رو حذف کن.
  4. #4
    2009/10/21
    تهران
    2,493
    194

    پاسخ : فراخواني توابع در C

    * ب هر بار فراخوانی مجددا برای متغیرها حافظه تخصیص داده میشه
    * با پر شدن پشته رفتار برنامه غیر قابل پیش بینی میشه
  5. #5
    2009/10/25
    تهران
    414
    24

    پاسخ : فراخواني توابع در 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. #6
    2008/07/03
    865
    26

    پاسخ : فراخواني توابع در C

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

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

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

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

    امام علي (عليه السلام) : الزکات العلم نشرهُ/ زکات علم نشر آن است
  7. #7
    2009/10/25
    تهران
    414
    24

    پاسخ : فراخواني توابع در C

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

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

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

موضوعات مشابه

  1. فراخواني BMP از mmc براي n96
    توسط babak_micro در انجمن میکروکنترلرهای AVR
    پاسخ: 4
    آخرين نوشته: 2015/04/23, 14:24
  2. مشکل در فراخواني component
    توسط ashena900 در انجمن PLD , SPLD , GAL , CPLD , FPGA
    پاسخ: 1
    آخرين نوشته: 2013/10/08, 08:25
  3. فراخواني ديتابيس
    توسط amirbahador87 در انجمن Matlab
    پاسخ: 2
    آخرين نوشته: 2013/01/22, 23:09
  4. کمک در رابطه با فراخواني بلوک
    توسط t_heidari_elc در انجمن PLD , SPLD , GAL , CPLD , FPGA
    پاسخ: 0
    آخرين نوشته: 2012/06/21, 08:24
  5. فراخواني MATLAB در VB
    توسط (soheila) در انجمن برنامه نويسي و اينترفيس
    پاسخ: 1
    آخرين نوشته: 2006/10/30, 11:43

کلمات کلیدی این موضوع

علاقه مندي ها (Bookmarks)

علاقه مندي ها (Bookmarks)

مجوز های ارسال و ویرایش

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