Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

An Example: Assumption Verification. Подтверждение предположений, используя утверждения является примером обычного использования препроцессора и его особенностей



Подтверждение предположений, используя утверждения является примером обычного использования препроцессора и его особенностей. assertion - утверждение, помещенное в исходный текст, чтобы проверить предположение. Обычно, программисты помещают утверждения в начале определения функции, чтобы проверить предположения, которые они сделали, проектируя функцию. Если во времени выполнения предположение, оказывается неправильным, утверждать assertion показывает сообщение и останавливает выполнение программы. Используемый в этой манере, assertion - превосходный инструмент для обнаружения ошибки.

Рассмотрим функцию calculate_average, который вычисляет среднее число ряда ценностей. Мы предполагаем, что функции передает два параметра целого числа отличных от нуля к функции. В контексте большей программы, если бы второй параметр передали как ноль, ошибка во время выполнения произошла бы в результате того, чтобы делить на ноль. Как мы можем обращаться с этими недействительными данными? Один путь, замеченный в Распечатке 6, вовлекает кодирование защитно, чтобы обнаружить недействительный случай данных.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: double calculate_average(int total, int count) { // avoid divide by zero error if (count!= 0) { return total / count; } else { return 0; }}
Listing 6 Defensive coding

Вышеупомянутая версия calculate_average работает, в котором это предотвращает деление на ноль ошибку. Это не учитывает, что нулевой счет мог подразумевать, что ошибка произошла в другой части программы. Возможно ошибка существует в коде, который читает ценности от пользователя. Или, возможно некоторый другой кодекс ошибочно переписывал ценность счета. Мы действительно не знаем, но использующий эту версию calculate_average не будет помогать нам обнаружить и определить местонахождение этой ошибки.

Следующая версия calculate_average берет другой подход. Здесь, предположение о действительных данных проверено, используя утверждение. Если гость проходов функции недействительные данные (то есть, счет равняется нолю) к функции, утверждение показывает сообщение об ошибке и останавливает выполнение программы. Программист может тогда найти ошибку, которая заставила прохождение недействительных данных функционировать calculate_average.

1: 2: 3: 4: 5: 6: 7: double calculate_average(int total, int count) { // assume we are given valid data assert (count!= 0); return total / count;}
Listing 7 Verifying an assumption using an assertion

Утверждать утверждение фактически - макрос. Содержавший в библиотеке <cassert>, это макро-определение - небольшой комплекс, но ценность, исследующая, так как это включает несколько различного использования препроцессора. Следующий пример перечисляет определение утверждения макро-от ГНУ C ++ компилятор.

1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: /* assert.h*/ #ifdef __cplusplusextern "C" {#endif #include "_ansi.h" #undef assert #ifdef NDEBUG /* required by ANSI standard */#define assert(p) ((void)0)#else #ifdef __STDC__#define assert(e) ((e)? (void)0: __assert(__FILE__, __LINE__, #e))#else /* PCC */#define assert(e) ((e)? (void)0: __assert(__FILE__, __LINE__, "e"))#endif #endif /* NDEBUG */ void _EXFUN(__assert, (const char *, int, const char *)); #ifdef __cplusplus}#endif
Listing 8 The assert macro definition

Заметьте использование условной трансляции в определении утверждения макро-. Включая определение NDEBUG в программу повредил бы все проверки утверждения. Выпуская версии производства программного обеспечения, программисты типично удаляют утверждения.





Дата публикования: 2014-12-08; Прочитано: 246 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.006 с)...