NOTICE توجه: این یک موضوع قدیمی است که آخرین پست ارسالی آن مربوط به 3823 روز قبل است . لطفا فقط پاسخ ها ، سوالات و درخواست های 100 درصد مرتبط را به آن ارسال کنید و برای درخواست ها و سوالات جدید موضوع جدیدی را ایجاد کنید
نمایش نتایج: از 1 به 4 از 4

موضوع: چگونه می شود بین توابع پرش کرد؟

  1. #1
    تازه وارد
    تاریخ عضویت
    Oct 2013
    نوشته ها
    4
    تشکر
    2
    تشکر شده 0 بار در 0 پست

    پیش فرض چگونه می شود بین توابع پرش کرد؟

    سلام،
    نمی دونم در جایی صحیحی مطرح می کنم یا نه! اما سوال من اینه که من یه برنامه ای در keil دارم با چندین تابع، در تابع ها در شرایطی نیاز میشه که به یک تابع دیگه پرش کنم و return هم نشم از اون تابع!!!
    به اولین لیبل تابع هدف اگر بخوام پرش کنم که اررور میده و میگه لیبل تعریف نشده!
    چون توابع خارج از While(1) قرار داره، پس به فرم لیبل هم نمی تونم درشون بیارم!
    چطوری می تونم این کار رو انجام بدم؟ ممنون میشم با یک تکه کد راهنمایی کنید.

  2. # ADS
    Circuit advertisement
    تاریخ عضویت
    Always
    نوشته ها
    Many
     

  3. #2
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2011
    نوشته ها
    26
    تشکر
    147
    تشکر شده 29 بار در 12 پست

    پیش فرض

    از تکنیک های مناسب برای چنین برنامه هایی، استفاده نکردن از صدا زدن تابع در تایع است. سعی کنید به main برگشته و دوباره تابع مورد نظر را با ورودی های جدید صدا بزنید. این کار مزیتی که دارد باعث میشود تا برنامه های LCD که دارای منو های تو در توست هنگ نکند و تحلیل برنامه را خیلی آسانتر میکند.

    راه دیگر استفاده از سیستم عامل است.

    اگر هنوز هم اصرار به انجام این کار دارید از longjmp در کتابخانه setjmp.h استفاده کنید. فقط هواستان باشد که stack به هم نریزد. در ضمن معمولا از این دستور برای Exception Handler استفاده میگردد
    ویرایش توسط hs_golpa : 28-10-2013 در ساعت 15:55

  4. تشکرها از این نوشته :


  5. #3
    تازه وارد
    تاریخ عضویت
    Oct 2013
    نوشته ها
    4
    تشکر
    2
    تشکر شده 0 بار در 0 پست

    پیش فرض

    نقل قول نوشته اصلی توسط hs_golpa نمایش پست ها
    از تکنیک های مناسب برای چنین برنامه هایی، استفاده نکردن از صدا زدن تابع در تایع است. سعی کنید به main برگشته و دوباره تابع مورد نظر را با ورودی های جدید صدا بزنید. این کار مزیتی که دارد باعث میشود تا برنامه های LCD که دارای منو های تو در توست هنگ نکند و تحلیل برنامه را خیلی آسانتر میکند.

    راه دیگر استفاده از سیستم عامل است.

    اگر هنوز هم اصرار به انجام این کار دارید از longjmp در کتابخانه setjmp.h استفاده کنید. فقط هواستان باشد که stack به هم نریزد. در ضمن معمولا از این دستور برای Exception Handler استفاده میگردد
    ممنون از پاسختون.
    به ازای رویداد های مختلف باید توابع مختلف اجرا بشن (از یک تابع با ورودی مختلف اجرا نمیشه که به main بر گردم و بعد انتخاب کنم!)
    منظورتون چیه که stack بهم نریزه؟ به این دلیل که تابع هایی که اجرا میشه در stack نمونه می خوام به محل فراخوانی برگشت نکنم دیگه!
    سیستم عامل هم تا کنون کار نکردم و در مراحل آخری پروژه هستیم و فرصت یادگیریش رو فعلا ندارم!
    یک نفر گفت با استفاده از پوینتر ها به آدرس تابع پرش کنم، این طوری دیگه به محل فراخوانی تابع بر نمی گرده و stack هم پر نمیشه! اما دقیقا منظورشون رو نفهمیدم به چه نحوی این کار رو باید انجام بدم...

  6. #4
    کاربر علاقه مند
    تاریخ عضویت
    Jan 2011
    نوشته ها
    26
    تشکر
    147
    تشکر شده 29 بار در 12 پست

    پیش فرض

    محل برگشت از یک تابع و ورودی های تابع جهت فراخوانی در stack ذخیره میگردد. حالا اگر در یک تابع هستید و هنوز از آن خارج نشده و بخواهید دوباره وارد همان تابع یا جای دیگری بشوید بایستی این مسیر تو در تو را طبق همان روالی که رفتید برگردید. به صورت اتوماتیک این کار توسط کامپایلر برای شما انجام می شود و لازم نیست به این موضوع دقت کنید. مشکل آنجاست که دستوراتی مثل longjump باعث میشود مدیریت این کار از دست کامپایلر خارج شود و ممکن است به حالتی برسد که نتواند راه برگشت را پیدا کند و آنگاه ریست می شود.

    در مورد صدا زدن تابع با اشاره گر هم به این لینک مراجعه کنید.

    اما به طور کلی اگر تابعی را بالاتر از توابع وقفه و main تعریف کنید در تمام توابع دیده می شود.

  7. تشکرها از این نوشته :


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

  1. !!!!! رگولاتور ولتاژ ژنراتور با استفاده از فیدبک !!!!!
    توسط REZA_KLNTR در انجمن کنترل هوشمند و plc
    پاسخ: 19
    آخرين نوشته: 29-05-2016, 17:18
  2. رگولاتور جریان برای برق شهر
    توسط hadi elec در انجمن الكترونيك قدرت
    پاسخ: 9
    آخرين نوشته: 29-05-2016, 17:16
  3. پاسخ: 1
    آخرين نوشته: 03-01-2013, 12:45
  4. رگولاتور 3.3v براي ARM
    توسط forghan در انجمن AT91 series (ATMEL)
    پاسخ: 7
    آخرين نوشته: 14-04-2011, 15:51
  5. کارتهای ۵۰ دلاری اینتل جهت افزایش توان پردازنده
    توسط M3R در انجمن اخبار کامپیوتر و IT و مسابقات رباتیک
    پاسخ: 0
    آخرين نوشته: 30-09-2010, 13:01

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

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