setjmp Programm
-
Hi Forum, ich hab mal wieder was gecodet
Diesmal setjmp.h, ich hab ein kleines Beispiel programmiert und wollte wissen, obs korrekt ist?
Vielen Dank!#include <stdio.h> #include <setjmp.h> static jmp_buf jump; int main () { if (setjmp(jump) != 0) { fataler(); prog(); } else printf("Kein fataler Fehler!\n"); return 0; } int fataler () { printf("Fataler Fehler!\n"); } int prog() { if (fataler() != 0) { longjmp(jump,1); printf("Programm\n"); } else printf("Fataler Fehler aufgetreten!\n"); }
-
Nö, fataler() hat z.B. keine return-Anweisung.
-
wozu return?
das ist nur eine Funktion, die fast nix macht
wenn du was sagst, dann gleich mit Code und Begründung
-
Begründung: Die Funktion hat einen Rückgabewert, gibt aber nichts zurück. Deshalb fehlt ein return
-
hm, void geht nicht. Ich brauch keinen Rückgabewert.
man kann auch so machen
int fataler () { printf("Fataler Fehler!\n"); return 0; }
Und jetzt korrekt?
-
warum sollte das nicht gehen
void fataler (void) { puts("Fataler Fehler!"); }
-
Die Verwendung von fataler() scheint mir auf jeden Fall schleierhaft - einerseits gibt es aus, ob ein Fehler aufgetreten ist, andererseits willst du später damit überprüfen, ob dein setjmp geklappt hat - da müsstest du irgendwie (a) den Unterschied kennzeichnen und (b) dir merken, ob ein Fehler aufgetreten ist.
-
maximo schrieb:
wozu return?
Nasenbär
. Weil du an einer Stelle den return-Wert verwendest. Bitte auch mal selber denken. Und möglichst auch mal dazu sagen, was das Programm eigentlich machen soll, dann kann man auch konstruktive Hilfe geben.
-
hm, ich schreib doch mal wie das Gerüst aussehen soll:
static jmp_buf jump; int main () { if (setjmp(jump) != 0) { non_fatal_fehler89, eigentliches_program(); } void non_fatal_fehler() { /* Behandlung des nicht-fatalen Fehlers */ } void eigentliches_program() { if(non_fatal_fehler_aufgetreten) longjmp(jump,1); }
Wenn während der Ausführung der Funktion eigentliches_program ein nicht-fataler Fehler auftritt, dann wird vor die Aufrufstelle von eigentliches_program zurückgesprungen, dort eine Fehlermeldung ausgegeben und eigentliches_program von neuen aufgerufen.
Ich hoffe es reicht
-
Dann schieb' den Aufruf von eigentliches_programm() mal aus dem if() raus - setjmp liefert beim setzen die Rückgabe 0 und beim Rücksprung (von longjmp) einen Wert !=0.
PS: Ich würde von set/longjmp komplett abraten - ruf lieber die Fehlerbehandlungsroutine direkt dort auf, wo der Fehler aufgetreten ist.
-
naja, das ist doch egal, ob die Funktion da ist oder nicht, oder?
Und das ist nur zur Lernzwecken und im Buch steht nix davon, dass es nicht gut ist.
-
OK, dann sage ich es dir jetzt - setjmp ist "nicht gut" (sogar noch schlechter als goto).
Zum inhaltlichen: Das Programm macht bestimmt nicht das, was es machen soll:
int main() { if(setjmp(buf)!=0) { //hier landest du nach dem longjmp()-Aufruf print_error(); mfunc(); } else { //hierher kommst du nach dem regulären Ausführungspfad printf("Alles OK"); } return 0; } void mfunc() { ... if(fehler) longjmp(buf,1); ... }
Merkst du etwas? Auf dem "normalen" Ausführungspfad landest du nicht in deiner Arbeitsfunktion - also würde dieses Programm nur "Alles OK" ausgeben und sich dann beenden.
PS: Wie willst du eigentlich nach der Behandlung des Fehlers weitermachen?
-
CStoll (off) schrieb:
OK, dann sage ich es dir jetzt - setjmp ist "nicht gut" (sogar noch schlechter als goto).
dann sind c++ exceptions aber auch 'nicht gut'
-
ich dachte es mir, ich lass so.
setjmp(buf) ist doch immer != 0, oder nicht?
Du hast doch das gleiche aufgeschrieben, nur anders ausgegeben.
-
net schrieb:
CStoll (off) schrieb:
OK, dann sage ich es dir jetzt - setjmp ist "nicht gut" (sogar noch schlechter als goto).
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
*erinnert sich noch dunkel an die Programmierung auf dem C64*
-
maximo schrieb:
ich dachte es mir, ich lass so.
setjmp(buf) ist doch immer != 0, oder nicht?
Du hast doch das gleiche aufgeschrieben, nur anders ausgegeben.The sigsetjmp(), setjmp(), and _setjmp() functions save their calling environment in env. Each of these functions returns 0.
The corresponding longjmp() functions restore the environment saved by the most recent invocation of the respective setjmp() function. They then return so that program execution continues as if the corresponding invocation of the setjmp() call had just returned the value specified by val, instead of 0.
setjmp() gibt beim Direktaufruf 0 zurück - longjmp tut so, als ob das zugehörige setjmp den Parameterwert (!=0) zurückgegeben hätte.
-
ok, aber ich versteh nicht, wo jetzt der Fehler sitzt. Ich habs mir paar mal durchgelesen (das Kapitel) aber irgendwie kapier ich es nicht.
Kann mir bitte einer das näher erklären?Vielen Dank
-
Dann lies dir nochmal durch, was ich geschrieben habe: Du rufst setjmp() auf und speicherst damit den aktuellen Stack-Status. Danach beendest du das Programm (der Teil hinter dem "if(setjmp(env)!=0)" wird erst nach dem zugehörigen longjmp()-Aufruf gestartet).
-
ja das weiss ich ja. Und ausser dass diese Funktion schlecht ist, was kannst du mir zu meinem Program sagen?
Ich wollte nur wissen, wo da der Fehler ist?
-
Soll ich es dir noch buchstabieren?
DU HAST DIE ANWENDUNG VON SETJMP FALSCH VERSTANDEN
(wie es richtig geht, habe ich ganz unten auf Seite 1 schon gesagt)