Willkommen ~Gast!
Registrieren || Einloggen || Hilfe/FAQ || Staff
Probleme mit der Registrierung im Forum? Melde dich unter registerEin Bild.
Autor Beitrag
000
08.02.2013, 14:03
Raziel



Hallo zusammen,

vielleicht liest dies hier noch jemand, bisher habe ich hier immer hilfreiche Antworten bzgl. C und Programmierung bekommen.

Folgendes:
Ich schreibe hin und wieder gerne kleinere C Programme. Dabei benutze ich die Makros EXIT_SUCCESS und EXIT_FAILURE, um aus dem Programm auszusteigen.

Jetzt ist mir nicht ganz klar, wann ich welches Makro benutzen sollte. EXIT_FAILURE ist soweit klar, zum Beispiel wenn eine Datei per fopen nicht geöffnet oder kein Speicher per malloc reserviert werden kann usw. Also bei fehlerhaften Verhalten. EXIT_SUCCESS kommt zum Einsatz, wenn alles erfolgreich durchgelaufen ist, zum Beispiel am Ende von main.

Jetzt ein paar Unklarheiten:

Quellcode:/* includes */
int main(int argc, char *argv[])
{
    if (argc != 2) {
        printf("Usage: %s <textfile>\n", argv[0]);
        return EXIT_SUCCESS; /* ? */
    }

    /* do s.th. */

    return EXIT_SUCCESS;
}
Es tritt ja an für sich kein Fehler auf. Das Programm läuft aber auch nicht so durch, dass ein Ergebnis ermittelt wird, weil die Angabe eines Parameters notwendig ist. EXIT_SUCCESS oder EXIT_FAILURE?

Nächster Fall: wie und wo steige ich aus einem Programm aus?

Quellcode:/* includes */

void foo(char *filename)
{
    FILE *file;
    
    if ((file = fopen(filename, "r")) == NULL) {
        fprintf(stderr, "%s\n", strerror(errno));
        return EXIT_FAILURE; /* ? */
    }
    
    /* do s.th. */
    
    fclose(file);
}

int main(int argc, char *argv[])
{
    foo("text.txt");
    return EXIT_SUCCESS;
}
Hier passiert der Fehler in foo(). Wie steige ich da elegant aus? Eigentlich ist es ja Blödsinn so dass Programm zu beenden. Eine void Funktion, die per return EXIT_FAILURE beendet wird - macht für mich erst einmal keinen großen Sinn. Vielleicht eine andere Funktion nutzen (abort, exit)?

Bin dankbar für jeden Tipp!

Grüße

--

zum Seitenanfang zum Seitenende Profil || Suche
001
08.02.2013, 19:20
theDon



Zitat:
Raziel postete
Es tritt ja an für sich kein Fehler auf. Das Programm läuft aber auch nicht so durch, dass ein Ergebnis ermittelt wird, weil die Angabe eines Parameters notwendig ist. EXIT_SUCCESS oder EXIT_FAILURE?
EXIT_FAILURE, weil das Programm nicht erfolgreich durchegelaufen ist.

Zitat:
Raziel postete
Eine void Funktion, die per return EXIT_FAILURE beendet wird - macht für mich erst einmal keinen großen Sinn. Vielleicht eine andere Funktion nutzen (abort, exit)?
Nicht nur ist das nicht sinnvoll, es beendet auch weder das Programm, noch ist es standardkonform; exit(EXIT_FAILURE) bietet sich hier an.

--

\o tanz den naziprau! o/

And more than ever, I hope to never fall,
Where enough is not the same it was before

zum Seitenanfang zum Seitenende Profil || Suche
002
08.02.2013, 20:57
Raziel



Danke für deine schnelle Antwort.

Du hast Recht: mit der return Anweisung verlasse ich nur die Funktion foo und beende nicht das Programm - soweit hatte ich nicht gedacht. Dann werde ich nun in Zukunft mit exit() arbeiten, wenn es sich anbietet.

--

zum Seitenanfang zum Seitenende Profil || Suche
003
10.02.2013, 21:23
Kriz



Diese Art der Programmierung solltest du schnell knicken, sprich aus Funktionen mit exit() aussteigen ist wie bei 100 km/h den Rückwärtsgang einlegen!

--

K:R-I)Z++
"CSS ist cascading style sheets. Und nicht so'n Ranzspiel." - dp
In memory of Voice († 2005/03/30)

zum Seitenanfang zum Seitenende Profil || Suche
004
11.02.2013, 17:19
Raziel



Was würdest du empfehlen? Ausstieg aus dem Programm nur in der main Funktion und Funktionen, die zu einem Abbruch führen könnten per Rückgabewert prüfen (ähnlich wie fopen auf Rückgabewert NULL)?

Gibt es generell (offizielle) Guidelines zum Programmaufbau/-ablauf in C? Hab schon gesucht, aber nichts handfestes finden können.

--

zum Seitenanfang zum Seitenende Profil || Suche
005
11.02.2013, 18:15
Alcapone



Du hast eben das Problem, wenn du mitten in einer Funktion die exit() methode aufrufst, werden die mit malloc allozierten ressourcen nicht mehr frei gegeben (z.B. bleiben Dateien, auf die du zugreifst, gelockt oder Ports, die du geöffnet hast bleiben blockiert).
Daher die Funktion sauber beenden, auch bei Fehlerfall die Ressourcen freigeben (destructor / free) und dann das Programm (am besten mit Rückgabecode) beenden.
Bezüglich Programmstruktur such mal nach Design-Pattern für C.

--

"Everything, that can go wrong, will go wrong" Murphy's Law

zum Seitenanfang zum Seitenende Profil || Suche
006
20.02.2013, 14:35
Raziel



Habe mittlerweile einige Artikel dazu gelesen und festgestellt, dass es etliche Wege gibt, ein Programm übersichtlich zu schreiben. Hauptsache man bleibt konsequent ;)

--

zum Seitenanfang zum Seitenende Profil || Suche