ich einen Blick auf the assert()
reference page nehmen und ich stecken geblieben, während ich das gegebene Beispiel lesen:Missverstehe ich die Verwendung von assert()?
/* assert example */
#include <stdio.h>
#include <assert.h>
int main()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
assert (datafile);
fclose (datafile);
return 0;
}
In diesem Beispiel behaupten wird verwendet, um die Programmausführung abzubrechen, wenn Daten-Datei gleich 0 vergleicht, was passiert, wenn der vorherige Aufruf von fopen nicht erfolgreich war.
Ich bin völlig einverstanden, dass, wenn fopen()
ausfällt, assert()
Ausführung abbrechen wird. Jedoch habe ich besorgt über die Richtigkeit dieses Beispiels bin:
Meiner Meinung nach assert()
gibt es Fälle zu erkennen, dass normalerweise nicht passieren (wie ein NULL
Zeiger auf eine Funktion, deren Dokumentation vorbei besagt, es ist verboten).
In diesem Beispiel ist es nicht möglich, nicht normal zu öffnen. In der Tat kann ich Dutzende von Gründen sehen, warum dies fehlschlagen würde. Die Datei konnte nicht existieren, das Programm konnte ohne die erforderlichen Berechtigungen ausgeführt werden und so weiter.
Ich würde lieber getan haben, so etwas wie:
/* not longer an assert example */
#include <stdio.h>
#include <assert.h>
int main()
{
FILE * datafile;
datafile=fopen ("file.dat","r");
if (datafile != NULL)
{
// Do something, whatever.
fclose (datafile);
} else
{
// Report the error somehow.
}
return 0;
}
Ist mein Verständnis davon, wie assert()
sollte falsch verwendet werden?
Bearbeiten und gute Nachrichten!
Es scheint, dass die genannte Website von rigorosen Menschen regiert wird. Hier ist die Post, die ich von einem der Website Maintainer zurück bekam:
Hallo Julien, ich muss zustimmen, die Beispielcode war schlecht gewählt. Es hat jetzt nur etwas umgeschrieben passender.
Vielen Dank für diesen Hinweis, und entschuldigen uns für etwaige Unannehmlichkeiten dies Sie verursacht haben.
Mit freundlichen Grüßen,
Und das aktualisierte Beispiel:
/* assert example */
#include <stdio.h>
#include <assert.h>
void print_number(int* myInt) {
assert (myInt!=NULL);
printf ("%d\n",*myInt);
}
int main()
{
int a=10;
int * b = NULL;
int * c = NULL;
b=&a;
print_number (b);
print_number (c);
return 0;
}
Froh, dass einige Leute über das Internet ihre Arbeit gut zu tun, um zu sehen! ;)
+1 Um zu erkennen, dass dies ein schlechtes Beispiel ist. +2 Für das Versenden der Site-Kontakte. –
Ihr Verständnis ist genau richtig. 'assert' steht für Programmierfehler, nicht für Benutzerfehler. – GManNickG
Ich habe das C++ - Tag entfernt, da es im Beitrag keinen C++ - Code mehr gibt. – Puppy