In diesem Kapitel werden Funktionen aus den Standard-Headerdateien näher erläutert, die bisher noch nicht oder nur zu kurz zur Sprache gekommen sind. Alle Headerdateien sind vom ANSI-C-Komitee vorgeschrieben und somit auf allen Systemen vorhanden.
20 Weitere Headerdateien und ihre Funktionen (ANSI C)
20.1 <assert.h> – Testmöglichkeiten und Fehlersuche
Mit der Funktion
#include <assert.h> void assert(int ausdruck);
können Ausdrücke aus einem Programm auf logische Fehler getestet werden. Ist ausdruck gleich 0, wird das Programm mit einer Fehlermeldung beendet. Genauer gesagt: Erst wird eine Fehlermeldung auf stderr ausgegeben, etwa:
Assertion failed: ausdruck, file filename, line nnn
Der Dateiname und die Zeilennummern stammen von den Präprozessor-Makros __FILE__ und __LINE__. Danach wird die Ausführung des Prozesses mit der Funktion abort() beendet.
Ein einfaches Beispiel: Es werden zwei Zahlen durch einander dividiert. Dabei darf keine der Zahlen eine Null oder ein negativer Wert sein. Außerdem soll der Teiler nicht größer als der Nenner sein. Hier sehen Sie das Listing:
/* assertion1.c */ #include <stdio.h> #include <stdlib.h> #include <assert.h> int divide(int zahl1, int zahl2) { assert( (zahl1 >= 0 && zahl1 >= zahl2) && (zahl2 >= 0) ); return zahl1 / zahl2; } int main(void) { printf("%d / %d = %d\n",5,2,divide(5,2)); printf("%d / %d = %d\n",3,4,divide(3,4)); printf("%d / %d = %d\n",4,4,divide(4,4)); return EXIT_SUCCESS; }
Das Programm wird durch den Funktionsaufruf divide(3,4) mit folgender Fehlermeldung abgebrochen:
Assertion failed: assert( (zahl1>=0 && zahl1>=zahl2) && (zahl2>=0) ), file:Pfad_zur_Datei.c, line 6
Diese Art, Programme zu testen, eignet sich sehr gut für größere Projekte. Damit Sie nicht den ganzen Code durchsuchen müssen, um anschließend bei der Fertigstellung des Programms die assert()-Anweisungen zu entfernen, müssen Sie nur das Makro
NDEBUG
angeben, und der Compiler ignoriert alle assert()-Aufrufe. NDEBUG muss allerdings noch vor der Headerdatei
#include <assert.h>
angegeben werden. Bei dem folgenden Beispiel wird die assert()-Anweisung ignoriert:
/* assertion2.c */ #include <stdio.h> #include <stdlib.h> #define NDEBUG #include <assert.h> int divide(int zahl1, int zahl2) { assert( (zahl1 >= 0 && zahl1 >= zahl2) && (zahl2 >= 0) ); return zahl1 / zahl2; } int main(void) { printf("%d / %d = %d\n",5,2,divide(5,2)); printf("%d / %d = %d\n",3,4,divide(3,4)); printf("%d / %d = %d\n",4,4,divide(4,4)); return EXIT_SUCCESS; }
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.