سلام دوستان
اشکال زدایی برنامه، برای داشتن یک برنامه کامپیوتری کارا و بدون نقص لازم است. در زمان کامپایل/اجرا، اشکالات مختلفی می تواند در حین نوشتن برنامه به وجود بیاید؛ یکی از دسته های این اشکلات، اشکالات منطقی است. برطرف کردن این نوع اشکالات گاهی می تواند بسیار اعصاب خورد کن و زمان بر باشد. در این پست، می خواهیم نکاتی درباره تابعی از قبل آماده شده در زبان C و ++C بیان کنیم که با استفاده از آن می توانید در صورتی که قسمتی از برنامه، نتیجه ای برخلاف نتیجه مطلوب شما داشت متوجه آن بشوید.
فرم تعریف تابع:
#include <assert.h> //or <cassert> void assert (int expression);
اگر مقدار آرگومان (expression)، مقدار عددی ۰ و یا مقدار بولین false باشد، این تابع ابتدا متنی با شکل و محتوای زیر روی دستگاه خروجی خطای استاندارد، می نویسد و سپس به اجرای برنامه، به طور ناتمام خاتمه می دهد.
Assertion failed: <expression>, file <filename>, line <line number>
خوب تا اینجا، شما به عنوان یک برنامه نویس، خط کد و عبارت آن را که نتیجه ای خلاف انتظار دارد و اشکال منطقی برنامه شما را به وجود می آورد، شناختید.
بعد از دیدن یک مثال بسیار ساده، با ذکر دو نکته معرفی تابع ()assert را به اتمام می رسانیم. البته یافتن دلیل اشکال منطقی برنامه مثالی را به عهده خواننده باهوش و کاردان می گذاریم!
/* assert example */ #include <stdio.h> /* printf */ #include <assert.h> /* assert */ void print_number(int* myInt) { assert (myInt!=NULL); printf ("%dn",*myInt); } int main () { int a=10; int * b = NULL; int * c = NULL; b=&a; print_number (b); print_number (c); return 0; }
و اما نتیجه :
نکته اول:
هنگامی که برنامه شما از این دست مشکلات خالی شد و یا آماده بودید که برنامه را به سفارش دهنده تحویل بدهید، استفاده از ماکروی زیر می تواند موجب شود کامپایلر در کامپایل بعدی تمام دستورات assert را نادیده بگیرد. اما توجه داشته باشید که حتماً این ماکرو باید قبل از هدر فایلِ assert.h یا cassert تعریف شده باشد، در غیر این صورت بی استفاده خواهد بود.
#define NDEBUG
نکته دوم:
نکته دوم ربط محسوسی به نکته اول دارد. در نکته اول گفتیم تمام دستورات assert می تواند با تعریف ماکروی مذکور نادیده گرفته بشوند؛ پس وابسته کردن برنامه به اجرای حتمی دستور assert اشتباهی بزرگ است. مثال های زیر منظور را واضح تر ارائه خواهد داد.
// BAD assert(x++); // GOOD assert(x); x++; // Watch out! Depends on the function: assert(foo()); // Here's a safer way: int ret = foo(); assert(ret);