اطلاعیه

Collapse
No announcement yet.

مفهوم دستور While(0U) چی هست

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

    مفهوم دستور While(0U) چی هست

    سلام و درود
    توی کتابخونه های Stm32، Define هایی قرار دارند به شکل زیر، معنا و مفهوم شرط while چی هست.
    کد:
    [COLOR=#333333][FONT=Consolas]#define __HAL_RCC_TIM1_CLK_ENABLE()   do { \[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        __IO uint32_t tmpreg; \[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        /* Delay after an RCC peripheral clock enabling */\[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        UNUSED(tmpreg); \[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                      } while(0U)[/FONT][/COLOR]
    و
    کد:
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=define"]#define[/URL]  UNUSED(x) ((void)(x))
    خوب قراره تایمر 1 رو فعال کنیم بعد از ست کردن بیت فعال سازی و خواندن بیت مربوطه به شرط حلقه while میرسیم. 0U یعنی عدد به فرمت unsigned int . در نتیجه یعنی 0 ، خوب بودن مقدار صفر در شرط while مانع از دوباره اجرا شدن حلقه میشه در نتیجه چه نیازی به بودن حلقه می باشد؟

    #2
    پاسخ : مفهوم دستور While(0U) چی هست

    نوشته اصلی توسط hadi2020 نمایش پست ها
    سلام و درود
    توی کتابخونه های Stm32، Define هایی قرار دارند به شکل زیر، معنا و مفهوم شرط while چی هست.
    کد:
    [COLOR=#333333][FONT=Consolas]#define __HAL_RCC_TIM1_CLK_ENABLE()   do { \[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        __IO uint32_t tmpreg; \[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        /* Delay after an RCC peripheral clock enabling */\[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                        UNUSED(tmpreg); \[/FONT][/COLOR]
    [COLOR=#333333][FONT=Consolas]                                      } while(0U)[/FONT][/COLOR]
    و
    کد:
    [URL="https://www.eca.ir/forums/usertag.php?do=list&action=hash&hash=define"]#define[/URL]  UNUSED(x) ((void)(x))
    خوب قراره تایمر 1 رو فعال کنیم بعد از ست کردن بیت فعال سازی و خواندن بیت مربوطه به شرط حلقه while میرسیم. 0U یعنی عدد به فرمت unsigned int . در نتیجه یعنی 0 ، خوب بودن مقدار صفر در شرط while مانع از دوباره اجرا شدن حلقه میشه در نتیجه چه نیازی به بودن حلقه می باشد؟
    بله ، با توجه به شرط حلقه ، فقط یکبار اجرا میشه ، پس چه نیازی به بودنش هست ؟
    ولی دقت کنید که اینجا تعریف تابع نداریم و این دیفاین هستش
    دیفاین برای معرفی یک عبارت به جای یک دستور العمل به کار میره نه بیشتر
    برنامه نویس اینجا با استفاده از کلمه do در واقع اون چند دستور العمل را در قالب یک دستور العمل مرکب بیان کرده
    منظورم اینه که اگه اون do و while آخر را بردارید ، مترجم اشکال میگیره
    ولی با این حقه میتونیم چند دستور العمل را دیفاین کنیم که در غیر اینصورت غیر ممکن میشد

    دیدگاه


      #3
      پاسخ : مفهوم دستور While(0U) چی هست

      نوشته اصلی توسط x935418 نمایش پست ها
      ولی دقت کنید که اینجا تعریف تابع نداریم و این دیفاین هستش
      دیفاین برای معرفی یک عبارت به جای یک دستور العمل به کار میره نه بیشتر
      برنامه نویس اینجا با استفاده از کلمه do در واقع اون چند دستور العمل را در قالب یک دستور العمل مرکب بیان کرده
      منظورم اینه که اگه اون do و while آخر را بردارید ، مترجم اشکال میگیره
      ولی با این حقه میتونیم چند دستور العمل را دیفاین کنیم که در غیر اینصورت غیر ممکن میشد
      استفاده از do{..}while(0) به این دلیل نیست که در ماکرو نمی توان از چند دستور العمل استفاده کرد. بلکه این امر کاملا مجاز است. استفاده از این روش به این دلیل است که بتوانیم از ماکرو مذکور شبیه یک تابع در if استفاده کنیم. در دو لینک زیر در این مورد کاملا توضیح داده شده است:


      اوژن: به معنای افکننده و شکست دهنده است
      دانایی، توانایی است-Knowledge is POWER
      برای حرفه ای شدن در الکترونیک باید با آن زندگی کرد
      وضعمان بهتر می شود، اگر همه نسبت به جامعه و اطراف خود مسوول باشیم و نگوئیم به ما چه
      قوی شدن و خوب ماندن - خوبی کردن به دیگران یک لذت ماندگار است
      اگر قرار باشد نفت و منابع خام را بدهیم و چرخ بگیریم، بهتر است چرخ را از نو اختراع کنیم
      ساعت کار بدن اکثر انسان ها کمتر از 800000 ساعت است و بعد از آن از کار می افتد

      دیدگاه

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