اطلاعیه

Collapse
No announcement yet.

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

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

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

    سلام

    یه برنامه ای نوشتم به طوری که پی در پی تو در تو توابع فراخوانی می شن ( به عنوان مثلا یه اینترفیس کاربری )

    مثلا وقتی یه تابع با نام x فراخوانی میشه در توی اون تابعی با نام y فراخوانی میشه که در نهایت خود y دوباره x رو فراخوانی می کنه و تا بی نهایت می تونه ادامه داشته باشه

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

    ممنون میشم دوستان تجاربشون و راهنمایی هاشون رو در اختیار من بذارن .


    تشکر

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

    به نظر من اصلا کامپایلر نباید اجازه ی کامپایل چنین کدی رو بده
    وقتی دو تا تابع رو به این شکل تو در تو صدا میکنید باعث سرریز شدن حافظه ی Stack میشه و این یعنی همه چیز به هم میریزه.این جا رو یه نگاه بندازید:
    http://en.wikipedia.org/wiki/Stack_buffer_overflow
    اگر شما نیاز دارید که دوتا تابع باهم اجرا بشند از سیستم مولتی تسکینگ استفاده کنید .اگر شما بگی که چرا میخوای این کار رو بکنی راحت تر میشه گفت چاره چیه!!!
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    دیدگاه


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

      ساده ی کار این میشه

      در ال سی دی رنگی که داریم یه صفحه اول می اد 3 تا گزینه هست روی هر کدوم رو لمس کنیم(تاچ داریم) وارد صفحه مربوطه میشه
      در تمامی صفحات هم یه گزینه دوباره برای بازگشت به صفحه اول است و دوباره در صفحه اول همون 3 تا گزینه

      دیدگاه


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

        خوب شما تو حلقه ی اصلی برنامه چند بار (بستگی به حجم کد)مقدار مختصات صفحه رو بخونید و تو دوتا متغیر موقتی ذخیره کنید .بعد براساس مقدار اونها هر تصمیم گیری که لازمه رو انجام بدید. به این نکته هم توجه داشته باشید که میکرو علاوه بر خوندن مختصات وظایف دیگه ای هم داره.پس نباید زیاد میکرو رو با این مشغول کنیم. شما این صفحه ی تاچ رو مثل یه کلید تصور کنید.قبلا چه طور براساس وضعیت کلید تصمیم گیری میکردید الان هم همون طور رفتار کنید منتها با دیدی باز تر. :nerd:
        لازمه بیشتر توضیح بدم؟ :bye
        [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

        دیدگاه


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

          شما چنین کاری انجام دادید قبلا ؟ چون فکر کنم اگه وارد عمل بخواهید بشید این چیزی که میگید پیاده نمیشه

          کمی تشریح کنم :

          صفحه اول اجرا میشه و در همون تابع اجرا صفحه اول صفحه تاچ پیوسته خونده میشه ( از تابع خارج نمی شیم چون اگر بعدا تابع فراخونی شد دوباره صفحه تاچ خونده بشه) تا مقداری که دریافتی یکی از 3 گزینه موجود در صفحه اول باشه بعد وارد یکی از اون 3 گزینه میشه (تابع اول بسته نشده اگر فرض کنید تابع به پایان برسه و بعد وارد گزینه ها بشیم برای دفعه اول درست می اد ولی برای دفعات بعد که از سایر صفحات بر می گردیم به صفحه اول مشکل ساز میشه - اگر تصور کنید و روی کاغذ مسیر رو ترسیم کنید می بینید) به همین منوال در بقیه گزینه ها

          اگر من بهتر متوجه نشدم منظور شما ممنون میشم توضیح در مورد فقط تغییر وضعیت بین صفحات رو بدید

          دیدگاه


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

            برای کار ساده ای داری منطق پیچیده ای استفاده میکنی. از فراخونی تابع استفاده نکن. یا یک GUI بساز یا جدولی کار کن. بر اساس یک مثلا ماشین وضعیت. کمترین میزان حافظه رو هم مصرف میکنی.
            اگر خواستی مشخصات پروژه ات را بفرست تا برات یه تحلیل کوچولو کنم و بهت نشون بدم چه راههای راحتتری از لقمه دور سر پیچوندن هم هست. لا اقل اینجا میشه به خزعبلات سهراب سپهری تاءسی کرد: جور دیگر باید دید.

            فقط بگم که مطمئنا فقط نحوه چیدن کدهای پایه رو کنار هم اشتباه انتخاب کردی.

            دیدگاه


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

              سلام

              آقای آقایی فر تا اونجا که من فهمیدم شما میخواهی menu system پیاده کنی. من تو یه پروژه دستگاه حضور غیاب این کار رو کردم. راه های زیادی رو امتحان کردم بهترین راه همونی هست که agha_reza هم بهش اشاره کردن یعنی استفاده از ماشین حالت و پیاده سازی الگریتم بر مبنای همون ماشین حالت.

              برای مثال فرض کنید من با فشار دادن یک کلید وارد روتینی میشم که به وسیله یک حلقه (با شرط غلط) قفل میشه. حالا وقفه ای اتفاق میافته و با توجه به اینکه این وقفه چه شرایطه جدیدی ایجاد کرده برنامه در برگشت به جای قبلی از حلقه فرار کرده و مسیر جدید رو میره(با توجه به شرایط پیش آمده.)

              در آخر اینکه من خودم نفهمیدم چی نوشتم امید وارم شما گرفته باشی!! :biggrin:

              با تشکر
              Work with what you have .Never limit yourself by things you could have had

              دیدگاه


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

                نوشته اصلی توسط علی آقایی فر
                شما چنین کاری انجام دادید قبلا ؟ چون فکر کنم اگه وارد عمل بخواهید بشید این چیزی که میگید پیاده نمیشه

                کمی تشریح کنم :

                صفحه اول اجرا میشه و در همون تابع اجرا صفحه اول صفحه تاچ پیوسته خونده میشه ( از تابع خارج نمی شیم چون اگر بعدا تابع فراخونی شد دوباره صفحه تاچ خونده بشه) تا مقداری که دریافتی یکی از 3 گزینه موجود در صفحه اول باشه بعد وارد یکی از اون 3 گزینه میشه (تابع اول بسته نشده اگر فرض کنید تابع به پایان برسه و بعد وارد گزینه ها بشیم برای دفعه اول درست می اد ولی برای دفعات بعد که از سایر صفحات بر می گردیم به صفحه اول مشکل ساز میشه - اگر تصور کنید و روی کاغذ مسیر رو ترسیم کنید می بینید) به همین منوال در بقیه گزینه ها

                اگر من بهتر متوجه نشدم منظور شما ممنون میشم توضیح در مورد فقط تغییر وضعیت بین صفحات رو بدید
                من هم الان دارم روی یه همچنین چیزی کار میکنم ولی هنوز کامل نشده. برای این کار من چند تا برنامه ی آماده رو از تو اینترنت پیدا کردم و بررسی کردم.عموما در اول روتین مقدار مختصات رو محاسبه میکردند و براساس اون تصمیم میگرفتند.اگه هیچ کدوم از شرط ها درست نبود در روتین فعلی میموند و منتظر فشردن یکی از اون سه تا کلید میموند.
                اگر یکی از این کلید های مجازی رو کاربر فشار بده ,برنامه وارد یه روتین دیگه ای میشه و صفحه ی متناظر با اون کلید رو نمایش میداد.برای کنترل صفحه ها هم از هندل استفاده میکنند.یعنی به هر صفحه یه شماره ی منحصر به فرد اختصاص میدند و از طریق اون صفحه ها رو میشناسند.این مثال رو نگاه کنید:
                کد:
                while(1)
                { 
                unsigned char x,y;
                LCD_show(.........);   //show the back screen image &button shape
                
                x=read_touch_x();
                y=read_touch_y();
                
                    if(................) run_button1_function();
                else if(................) run_button2_function();
                else if(................) run_button3_function();
                
                }
                این مثال به طور فرضی نوشته شده تا روتین کلی کار رو نشون بده.مسلما اگر شما نیاز به بررسی چیز های دیگه تو برنامه داشته باشی باید حلقه ها رو بنا به کارتون تغییر بدید. شما برنامه رو به فرم بالا بنویسید مطمئن باشید جواب میده.توی تابع کلید ها هم حلقه های همیشه درست ایجاد کنید تا برنامه توی اون ها بمونه و اگر کلید Back رو فشار داده شد از حلقه ی بینهایت بیاد بیرون و برگرده تو همین صفحه.این طوری روی کاغذ هم تناقضی پیدا نمیکنه :nice:
                اگه تعداد پارامتر ها یا صفحاتون بیشتر از حد نرمال بود باید هندل ها رو هم اضافه کنید. من الان روی همین هندل ها گیر کردم :angry:
                راستی ماشین وضعیت رو بیشتر توضیح میدید؟ یعنی سرعت برنامه که با ماشین وضعیت نوشته شده باشه بالاتره؟
                یه مثال ساده در مورد ماشین وضعیت میزنید؟
                [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                دیدگاه


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

                  نوشته اصلی توسط shahinbahari
                  راستی ماشین وضعیت رو بیشتر توضیح میدید؟ یعنی سرعت برنامه که با ماشین وضعیت نوشته شده باشه بالاتره؟
                  یه مثال ساده در مورد ماشین وضعیت میزنید؟
                  اگر مدار منطقی پاسیدی عکس زیر رو نگاه کن همه چیز یادت میاد


                  اگرم نه دوباره به همون عکس نگاه کن در حالت شروع ما در وضعیت q0 قرار داریم حالا با توجه به نوع ورودی به یه حالت دیگه میریم و یا در همون حالت باقی میمونیم. مثلا در حالت q3 اگر ورودی صفر باشه تو همون میمونیم و اگر 1 باشه اتفاقی نمیافته در نتیجه اگر بیام به حالت q3 همیشه همونجا میمونیم :mrgreen:

                  حالا شما برای منو سیستم هم از همین روال استفاده میکنی حالت های مختلف میشه وضعیت های مختلف منو شما چیزی که مهمه اینه که با چه تکنیکی بتونی این جریان حرکت بین وضعیت های مختلف رو ایجاد کنید.

                  مورد دیگه بروز رسانی صفحه نمایش هست که باید روتین هایی رو هم برای بروز رسانی اون بنویسید.
                  در آخر هم که تمام گزینه ها در منو به یک عملیات (وظیفه) ختم میشه و شما برای هر کدوم هم یه تابع مینویسی
                  مثل تابع set_date() و ...
                  Work with what you have .Never limit yourself by things you could have had

                  دیدگاه


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

                    ببخشید کدوم عکس رو نگاه کنم؟؟
                    عکسی نیومده!!
                    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                    دیدگاه


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

                      جدی!!؟؟؟ تو سیستم من نشون میده :redface:
                      بیخیال یه سرچ کن state machine دیاگرام های حالت رو میبینی
                      یا برو به آدرس زیر یه پروژه تعغیب خط گزاشته نمودار حالتش خوبه
                      http://courses.cit.cornell.edu/ee476/FinalProjects/s2007/bl222_wh84/bl222_wh84/index.html

                      Work with what you have .Never limit yourself by things you could have had

                      دیدگاه


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

                        ممنون دوستان

                        آقای شاهین بهاری مثلا در همو قطعه کدی که گذاشتید فرض کنیم run_button2_function(); اجرا میشه
                        خود تابع فوق موجب میشه مثلا یه صفحه جدید در ال سی دی نشون داده شه در صفحه جدید یه گزینه هست برای برگشت به صفحه اول یعنی در همون تابع صفحه دوم ، تابعی برای اجرای صفحه اول فراخونی میشه ...

                        ماشین حالت هم همون کاری شد که من کردم خوب

                        من برای حل مشکل فوق اینطوری کردم که وقتی مثلا در صفحه دوم ، گزینه برای بازگشت صفحه اول کلیک شد اجرا نکنه و فقط یه متغیر رو عوض می کنه و بعد به طور کامل از تابع صفحه دوم خارج میشه و بر می گرده به تابع قبلی اونجا این متغیر رو چک می کنم و بر مبنای اون صفحه ی بعدی رو نشون می دم

                        جناب سیدجلال حسینی و آقارضا و آقای بهاری منظور شما این بود ؟

                        دیدگاه


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

                          عمدتا اینجوری که میگین میشه با کمی تفاوت در جزئیات. مسئله مهم اینه که سیستم نبایستی در حالت بلوکه بمونه. یک چیزی معادل سیستم event-based در windows. حالا میشه این پیاده سازی با ماشین وضعیت باشه یا چیزی شبیه اون. اما اصول در هر حالت یکیه.

                          ما در اینجا سه قسمت داریم:

                          1- توابع برای انجام عملیات منطقی اولیه.
                          2- متغیر ها برای نگهداری وضعیت سیستم.
                          3- رخداد ها برای تحریک برنامه برای تصمیم گیری و اجرای توابع.

                          به هر حال بنظر میاد مشکلتون حل شده و اینه که مهمه.

                          دیدگاه


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

                            من فکر میکنم اگه مسئله رو اینقدر سخت نکنیم بهتره. ما که نمیخوایم برای ویندوز برنامه بنویسیم. من پیشنهادم اینه :
                            1- برای هر صفحه که قرار نشون بدی مثلا یه تابع بنویس و برای نشون دادن صفحه مورد نظر، تابع مخصوصش رو فراخوانی کن
                            2- برای بازگشت از زیر منوها(زیر صفحه ها) چند تا کد بازگشتی عمومی تعریف کن مثلا 1- یعنی بازگشت به منوی اصلی هر جا که هستیم مثل دکمه return در گوشی های موبایل. حالا اگه تو منوی y هستی و میری تو منوی z اگه کاربر تو صفحه z کلید بازگشت به منوی اصلی (xمثلا) رو انتخاب کرد، تابع z کارش رو با return -1; تموم میکنه و عدد 1- رو به y برمیگردونه. تابع y هم که با مقدار 1- روبرو میشه همونجا کارش رو تموم میکنه و به تابع قبلیش مقدار 1- رو برمیگردونه وووووووو میرسیم به منوی اصلی. من اینکار رو کردم و جواب هم داده

                            دیدگاه


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

                              نوشته اصلی توسط علی آقایی فر
                              ماشین حالت هم همون کاری شد که من کردم خوب

                              من برای حل مشکل فوق اینطوری کردم که وقتی مثلا در صفحه دوم ، گزینه برای بازگشت صفحه اول کلیک شد اجرا نکنه و فقط یه متغیر رو عوض می کنه و بعد به طور کامل از تابع صفحه دوم خارج میشه و بر می گرده به تابع قبلی اونجا این متغیر رو چک می کنم و بر مبنای اون صفحه ی بعدی رو نشون می دم

                              جناب سیدجلال حسینی و آقارضا و آقای بهاری منظور شما این بود ؟
                              بله منظور من همین بود. به هر حال اجرای یه همچین الگوریتمی نیازی به اجرای توابع تو در تو نداره و در نتیجه شما مشکل سر ریز استک هم نداری.

                              در ضمن شما با ماشین حالت فقط منطق کاری که میخواهید بکنید دستتون میاد و این به خود شما بستگش داره که این منطق رو چطور پیاده سازی کنید.
                              Work with what you have .Never limit yourself by things you could have had

                              دیدگاه

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