PDA

View Full Version : مفهوم دستور While(0U) چی هست



هادی2020
چهارشنبه 01 آذر 1396, 11:02 صبح
سلام و درود
توی کتابخونه های Stm32، Define هایی قرار دارند به شکل زیر، معنا و مفهوم شرط while چی هست.

#define __HAL_RCC_TIM1_CLK_ENABLE() do { \
__IO uint32_t tmpreg; \
SET_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\
/* Delay after an RCC peripheral clock enabling */\
tmpreg = READ_BIT(RCC->APB2ENR, RCC_APB2ENR_TIM1EN);\
UNUSED(tmpreg); \
} while(0U)

و

#define UNUSED(x) ((void)(x))

خوب قراره تایمر 1 رو فعال کنیم بعد از ست کردن بیت فعال سازی و خواندن بیت مربوطه به شرط حلقه while میرسیم. 0U یعنی عدد به فرمت unsigned int . در نتیجه یعنی 0 ، خوب بودن مقدار صفر در شرط while مانع از دوباره اجرا شدن حلقه میشه در نتیجه چه نیازی به بودن حلقه می باشد؟

هادی2020
چهارشنبه 01 آذر 1396, 15:20 عصر
دقت کنید که اینجا تعریف تابع نداریم و این دیفاین هستش
دیفاین برای معرفی یک عبارت به جای یک دستور العمل به کار میره نه بیشتر
برنامه نویس اینجا با استفاده از کلمه do در واقع اون چند دستور العمل را در قالب یک دستور العمل مرکب بیان کرده
منظورم اینه که اگه اون do و while آخر را بردارید ، مترجم اشکال میگیره
ولی با این حقه میتونیم چند دستور العمل را دیفاین کنیم که در غیر اینصورت غیر ممکن میشد
منبع (https://www.eca.ir/forums/thread78867.html#post665016)

keyhan
سه شنبه 11 اردیبهشت 1397, 12:58 عصر
سلام
خسته نباشید
شما اگر دستور do و while رو بردارید ولی کروشه ها را دست نزنید باز کامپایلر خطا نمیده، منظور بنده اینه که دستور do و while به دلیل دیگری اینجا قرار داده شده اند. آن هم ین است که هنگامی که از define استفاده میشود کامپایلر عبارت define شده را به جای عبارت قبلی در هنگام کامپایل جایگذاری میکند که این امر مستوجب رخ دادن خطاهای غیر منتظره در بعضی از مواقع میشوند که اینجا به دلیل فشای کم قادر به توضیح آن نیستم، ولی اربتاطی به چند خط بودن define ندارد. در define، / برنامه نویس را قادر می سازد تا define را چند خطی بنویسد.