PDA

View Full Version : سوال: در مورد Assert



khorzu
پنج شنبه 01 مهر 1389, 09:49 صبح
سلام
در مورد <assert.h> اینکه چی کار می کنه و کاربردش چیه اگه کمک کنید ممنون می شم.

PC2st
پنج شنبه 01 مهر 1389, 10:48 صبح
بطور خلاصه، از assert برای بررسی شرطهایی استفاده می‌شود که ممکن است در زمان کامپایل/اجرا نیاز به بررسی داشته باشند اما کاربر در نتیجهٔ این شرطها بی‌تاثیر است (به عبارت دیگر، از assert بر روی نتیجهٔ شرطهایی استفاده کنید که فقط به کدهای نوشته‌شده توسط برنامه‌نویس، وابسته است و تصمیمات کاربر (یا سایر موارد)، در آن بی‌تاثیر باشد):

assert(param1 != NULL);param1 پارامتر یک تابع است، اگر شرط درون assert برقرار نباشد، برنامه در زمان اجرا متوقف شده و همین شرط در خروجی به عنوان خطا به کاربر نمایش داده می‌شود.

مزایای assert در این است که:


شرطی که برقرار نبوده است را در خروجی به عنوان خطا چاپ می‌کند. بعداً برنامه‌نویس راحت‌تر می‌تواند منشاء خطای رخ داده را پیدا کند.
دستور assert یک ماکرو است. اگر ماکروی NDEBUG را در حین کامپایل تعریف کنید، همهٔ دستورات assert نادیده گرفته شده و انگار که اصلا چنین شرطهایی بررسی نشدند. بنابراین سرعت اجرای برنامه بطور محسوسی افزایش خواهد یافت.

با توجه به مورد دوم، از دستور assert تنها در مواردی استفاده کنید که کاربر در نتیجهٔ شرطها بی‌تاثیر باشد. درنتیجه، شرطهای درون assert تنها به کدهایی وابسته می‌شود که برنامه‌نویس در خارج از نظارت کامپایلر، آنها را اعمال کرده است. مثال، در همان دستور قبل، اگر برنامه‌نویس مقدار پارامتر یک تابع را NULL بفرستد، برنامه کامپایل می‌شود اما در زمان اجرا، با یک متن خطا متوقف خواهد شد. نه تنها برای موارد NULL بلکه برای بررسی بازهٔ اعداد و تشخیص نوع پارامترها و ... نیز از assert استفاده می‌شود (البته تا زمانیکه کاربر بر روی نتیجهٔ این شرطها تاثیرگذار نباشد زیرا پس از تست کامل برنامه، بتوان با تعریف ماکروی NDEBUG با خیال آسوده، همهٔ دستورات assert را نادیده گرفت).

Salar Ashgi
پنج شنبه 01 مهر 1389, 11:36 صبح
طبق قوانین تالار : نباید برای مباحث ابتدایی و مباحثی که آنها را میتوان با خواندن چندتا کتاب و یا جستجوی
چند سایت بدست آورد ، تاپیک ایجاد کرد !
بدلیل اینکه به تاپیک پاسخ داده شده بود ، حذف نشد ، ولی انتظار میرود از دفعات آینده این مطلب رعایت
شود . موفق باشید ./

این هم یک نمونه جستجوی ساده :


http://en.wikipedia.org/wiki/Assert.h
http://en.wikipedia.org/wiki/C%2B%2B_standard_library

khorzu
پنج شنبه 01 مهر 1389, 16:11 عصر
آقای مدیر؛
- در مورد موضوعاتی که هیچ اطلاع قبلی از چیستی اون ندارم ، خواندن مطالب انگلیسی برای من تا به حال نتیجه ای نداشته و گرنه هم در مورد Assert و هم در مورد Smart Pointer منابع انگلیسی رو قبلا بررسی کرده بودم و حدودا 3 تا از منابع فارسی سی رو هم در طول مثلا تحصیلاتم مطالعه کردم اما چیزی از این موضوع یادم نمی آید بحث شده باشه.
- به نظرم میاد قانون برای این وضع می شه که کار ها راحت تر انجام بشند. می شه ضرر زیر پا گذاشتن این قانون و منعت رعایت اون رو بفرمایید.
نمره اضافی: فلسفه اختراع فوروم را با ذکر مثال شرح کنید.
- اگر فرض کنیم Asert از «مباحث ابتدایی» زبان سی حساب می شود لازم می شود در این قانون از معیار سنجش هم کمی صحبت شود چون من بعد از 2 سال تجربه سی برای اولین بار هست که مجبور شدم در مورد assert به طور جدی پیگیری کنم و نمی تونم اونو ابتدایی فرض کنم.

Salar Ashgi
پنج شنبه 01 مهر 1389, 20:35 عصر
آقای مدیر؛
- در مورد موضوعاتی که هیچ اطلاع قبلی از چیستی اون ندارم ، خواندن مطالب انگلیسی برای من تا به حال نتیجه ای نداشته و گرنه هم در مورد Assert و هم در مورد Smart Pointer منابع انگلیسی رو قبلا بررسی کرده بودم و حدودا 3 تا از منابع فارسی سی رو هم در طول مثلا تحصیلاتم مطالعه کردم اما چیزی از این موضوع یادم نمی آید بحث شده باشه.
- به نظرم میاد قانون برای این وضع می شه که کار ها راحت تر انجام بشند. می شه ضرر زیر پا گذاشتن این قانون و منعت رعایت اون رو بفرمایید.
نمره اضافی: فلسفه اختراع فوروم را با ذکر مثال شرح کنید.
- اگر فرض کنیم Asertاز «مباحث ابتدایی» زبان سی حساب می شود لازم می شود در این قانون از معیار سنجش هم کمی صحبت شود چون من بعد از 2 سال تجربه سی برای اولین بار هست که مجبور شدم در مورد assert به طور جدی پیگیری کنم و نمی تونم اونو ابتدایی فرض کنم.

حتما کتاب های شما زیاد پربار نبوده اند ، چون تو همین کتاب دیتل ++C ویرایش دوم ، کتابخانه Assert.h
توضیح داده شده است ./
لطفا توجیه نکنید ، وقتی تصمیم گرفته ایم در این سایت عضو شویم ، یعنی به تمام قوانین این سایت
بی چون و چرا ، باید پایبند بود !!!

PC2st
پنج شنبه 01 مهر 1389, 22:37 عصر
طبق قوانین تالار : نباید برای مباحث ابتدایی و مباحثی که آنها را میتوان با خواندن چندتا کتاب و یا جستجوی
چند سایت بدست آورد ، تاپیک ایجاد کرد !منظور شما کدام بند است؟ فکر نمی‌کنم این سوالی که اینجا پرسیده شده فاقد محتوا باشه!
فاقد محتوا یعنی این پاسخی که من، شما و khorzu در این سه پست اخیر، ارسال کردیم و کلاً off-topic بود.

Salar Ashgi
پنج شنبه 01 مهر 1389, 23:02 عصر
منظور شما کدام بند است؟ فکر نمی‌کنم این سوالی که اینجا پرسیده شده فاقد محتوا باشه!

مثل اینکه شما اصلا به موضوع بحث توجهی نکردید ، کسی از فاقد محتوا بودن تاپیک حرفی نزده ، گفتگو
در مورد ابتدایی بودن موضوع تاپیک میباشد ./

این هم قانون تالار :



با توجه به زیاد شدن سوالات در زمینه تمرینات یا پروژه های دانشجویی و توجه نکردن به قوانین و نارضایتی کاربران بخش، از این پس کسانی که در سوالات خود موارد زیر را رعایت نکنند بدون تذکر ارسالشان حذف خواهد شد:
- سوالات بسیار ساده که جز مباحث بسیار اولیه برنامه نویسی است و با خواندن چند صفحه اول کتاب یا مرجع برنامه نویسی می توان به جواب آن رسید.
نکته: به عنوان یک دانشجو ابتدا باید مطالعه لازم را داشته باشید و سپس اگر در جایی از کدها یا برنامه نویسی ++C/C مشکل داشتید به اینجا مراجعه کنید، بخشی از کد خود را قرار دهید و در خواست راهنمایی در قسمت مورد نظر خود را کنید.

که البته بنده این تاپیک را حذف نکردم !
قانون تالار C++,C (http://www.barnamenevis.org/forum/showpost.php?p=646135&postcount=3)

PC2st
جمعه 02 مهر 1389, 00:34 صبح
3- سوالات بسیار ساده که جز مباحث بسیار اولیه برنامه نویسی است و با خواندن چند صفحه اول کتاب یا مرجع برنامه نویسی می توان به جواب آن رسید.ماکروی assert می‌تواند یک مبحث ساده باشه اما فکر نمی‌کنم جزء مباحث بسیار اولیهٔ برنامه‌نویسی باشد (مباحثی مثل متغیر چیست یا عملگر چیست و ...) حتی در سایت stackoverflow.com نیز در مواردی از این دست سوالات پرسیده می‌شود.