setjmp Programm
-
In dem Programm fehlt noch eine (sinnvolle) return-Anweisung in fataler() (und außerdem solltest du unterscheiden zwischen der Abfrage, ob ein Fehler aufgetreten ist (die Bedingung für den longjmp() im Hauptprogramm) und der Meldung, daß es einen Fehler gab (das, was hinter dem if(setjmp()!=0)... aufgerufen wird).
-
das kommt daraus, wenn man aus dem buch ein Programm erstellt, wo keine genauen infos gibt.
Und ich weiss echt nicht, was du unter"eine (sinnvolle) return-Anweisung" meinst.
-
maximo schrieb:
das kommt daraus, wenn man aus dem buch ein Programm erstellt, wo keine genauen infos gibt.
Und ich weiss echt nicht, was du unter"eine (sinnvolle) return-Anweisung" meinst.Ganz einfach; main() hat ja nicht umsonst einen Rückgabetyp (int). Da steckt ja eine gewisse Absicht dahinter. Dieser Rückgabewert zeigt nämlich dem Aufrufer, ob das Programm korrekt (das ist dann im Normalfall der Wert 0) oder fehlerhaft (!= 0) ausgeführt wurde. Dies kann man z.B. in anderen Programmen nutzen (z.B. beim Aufruf mit system()) oder in Batchdateien.
Da du in jedem Fall 0 zurücklieferst, ist dein Rückgabewert nicht sinnvoll.
-
Ich denke er meinte eher dass int falater() garkein return statement enthält
-
LordJaxom schrieb:
Ich denke er meinte eher dass int falater() garkein return statement enthält
Macht ja auch Sinn bei void ;). Aber dann wird fataler() in prog() total falsch verwendet und auch falsch aufgerufen, wodurch int und dann natürlich auch return Sinn macht :).
Deswegen ist der Returnwert von main() trotzdem nicht sinnvoll :p .
-
maximo schrieb:
Und ich weiss echt nicht, was du unter"eine (sinnvolle) return-Anweisung" meinst.
Ich meinte damit deine Funktion fataler() - so, wie sie dort steht, ist sie nicht geeignet, in deinem Hauptprogramm aufgerufen zu werden.
Zur Unterscheidung Fehler-Erkennung vs. Fehler-Behandlung: Du benötigst bei deinem Design zwei unterschiedliche Funktionen für deine Aufrufe von fataler():
void behandle_fehler() { printf("Fehler aufgetreten"); exit(1); } int erkenne_fehler() { if(/*Fehlerbedingungen*/) return 1; else return 0; } int main() { if(setjmp(env)!=0) behandle_fehler(); else prog(); return 0; } void prog() { ... if(erkenne_fehler()) longjmp(env,1); ... }
-
ich hab mir das noch mal in ruhe angeguckt. Nun frage ich mich, was ich hier rein schreiben soll?
if(/*Fehlerbedingungen*/)
Ich hab jetzt das reingeschrieben( mir ist nix anderes eingefallen
)
int erkenne_fehler() { if(jump != 0) return 1; else return 0; }
Und ich hab das mit dem 0 und 1 bzw. TRUE und FALSE verwechselt.
Das verwechle ich immer
Habt ihr vielleicht ne Eselsbrücke dafür?
-
CStoll (off) schrieb:
OK, dann sage ich es dir jetzt - setjmp ist "nicht gut" (sogar noch schlechter als goto).
In diesem Kontext sicher, aber es ist zuweilen doch recht nützlich, da es ähnliche Vorteile bietet wie die Exceptions in C++. Während man um goto praktisch immer herumkommt, hat setjmp() IMHO durchaus Existenzrecht.
CStoll (off) schrieb:
net schrieb:
dann sind c++ exceptions aber auch 'nicht gut'
Ne, die laufen schließlich in einigemaßen strukturierten Bahnen - mit setjmp/goto wirfst du dagegen alle Strukturen über Bord, die du in deinem Programm aufgebaut hast
Da setjmp() und Exceptions im Gegensatz zu goto meist zur Fehlerbehandlung, also im Ausnahmefall verwendet werden, ist es IMHO zu verschmerzen, daß sie den geregelten Programmfluß durcheinanderbringen. Der wesentliche Unterschied ist doch, daß longjmp() auf dem Stack gespeicherte Klassen nicht destruiert, und das fällt bei C nicht ins Gewicht.
Schlagt mich, wenn ich Unsinn rede...
-
@audacia: da bin ich auch deiner Meinung und es soll(te) ja auch nur dafür verwendet werden.
Deshalb war ich auch überrascht, dass man es mit goto vergleichen kann.
Ausserdem les ich ein Buch von Helmut Herold und das soll was heissen.
Dann hätte er auch was dazugeschrieben, finde ich. Wo bei goto, es sich überall liest ,dass es nicht gut ist. Kurz gesagt.Und schlagt mich nicht, wenn ich Unsinn rede
-
ich behaupte mal dass alle programmiersprachen, die kein goto-ähnliches konstrukt kennen, nix taugen
ach ja, schlagt mich wenn ....