پاسخ : آموزش winavr و avrlib
در تعریف s اومده:
char s[sizeof("4294967295"
];
این عدد 4294967295 همون عدد 0xFFFFFFFF هست در مبنای دهدهی و این یعنی بزرگترین عددی که میتونه یک نوع unsigned long در خودش نگهداری کنه. از طرفی وقتی یک عدد رو با تابع ultoa به آسکی تبدیل میکنین این تابع نمیتونه چک کنه که آیا بافر شما جا به اندازه کافی داره یا نه. بنا براین اون کسی که این کد رو نوشته به خیال خودش زرنگی کرده و میخواسته برای بد ترین حالت (یعنی وقتی عدد ورودی به تابع بزرگترین باشه) s دارای جا باشه. بنا براین اومده بزرگترین عدد این نوع رو به رشته تبدیل کرده و به اندازه اون حجم رشته رو برای s حافظه تخصیص داده. اما فراموش نکنیم که بعد از تمام کاراکتر ها در یک رشته حرفی عددی در زبان C یک کاراکتر '0\' هم احتیاجه. بنابراین strlen اینجا بدرد نمیخوره و بایستی از sizeof استفاده بشه. ضمنا strlen یک تابع زمان اجرا هست در صورتی که sizeof یک تابع مجازی زمان کامپایل هست. و این sizeof هست که اون '0\' انتهایی رو هم حساب میکنه (در این کیس بخصوص).
در مورد کذایی پورت مربوطه فرض کنیم شما میخوای بیت سوم از PINA رو چک کنی. میتونی بگی:
if(PINA & (1<<3))
{
}
و همینطور که میبینی احتیاجی به استفاده از متغیر هم نیست.
در تعریف s اومده:
char s[sizeof("4294967295"
];این عدد 4294967295 همون عدد 0xFFFFFFFF هست در مبنای دهدهی و این یعنی بزرگترین عددی که میتونه یک نوع unsigned long در خودش نگهداری کنه. از طرفی وقتی یک عدد رو با تابع ultoa به آسکی تبدیل میکنین این تابع نمیتونه چک کنه که آیا بافر شما جا به اندازه کافی داره یا نه. بنا براین اون کسی که این کد رو نوشته به خیال خودش زرنگی کرده و میخواسته برای بد ترین حالت (یعنی وقتی عدد ورودی به تابع بزرگترین باشه) s دارای جا باشه. بنا براین اومده بزرگترین عدد این نوع رو به رشته تبدیل کرده و به اندازه اون حجم رشته رو برای s حافظه تخصیص داده. اما فراموش نکنیم که بعد از تمام کاراکتر ها در یک رشته حرفی عددی در زبان C یک کاراکتر '0\' هم احتیاجه. بنابراین strlen اینجا بدرد نمیخوره و بایستی از sizeof استفاده بشه. ضمنا strlen یک تابع زمان اجرا هست در صورتی که sizeof یک تابع مجازی زمان کامپایل هست. و این sizeof هست که اون '0\' انتهایی رو هم حساب میکنه (در این کیس بخصوص).
در مورد کذایی پورت مربوطه فرض کنیم شما میخوای بیت سوم از PINA رو چک کنی. میتونی بگی:
if(PINA & (1<<3))
{
}
و همینطور که میبینی احتیاجی به استفاده از متغیر هم نیست.












دیدگاه