====== setjmp() ======
setjmp() ist definiert in der ''[[start|setjmp]]'', die in C über ''setjmp.h'', bzw. in C++ über ''csetjmp'' eingebunden wird.
===== Funktion =====
setjmp() definiert ein Sprungziel, das über [[longjmp]] erreicht werden kann.
Dabei wird eine [[jmp_buf]]-Struktur übergeben, die die zu wiederherstellende Umgebung definiert und von ''setjmp'' gefüllt wird.
int val = setjmp( env );
===== Signatur =====
#include
int setjmp( jmp_buf env );
**env**: Die wiederherzustellende Umgebung\\
**Rückgabewert**: Der im Aufruf von ''longjmp'' als Parameter angegebene Wert bzw. 0 bei der Definition des Sprungpunktes (1. Aufruf)
===== Beispiel =====
Im folgenden Beispiel werden 4 Ziel-Punkte definiert. An welchen Punkt gesprungen wird, wird über ''argv'' definiert. Dabei wird die Nummer des Sprungpunktes (1, 2 oder 3) eingegeben. Bei jeder anderen Eingabe oder wenn alle Punkte abgearbeitet wurden, wird an den letzte Punkt gesprungen.
#include
#include
#include
int main( int argc, char *argv[] )
{
// 3 Umgebungen zwischen denen gesprungen werden kann und Ende des Programms
jmp_buf env1, env2, env3, envEnd;
// Index des nächsten Zieles in 'argv'
int dstIndex = 0;
// Nächstes Ziel
int dst;
// 1. Ziel-Punkt setzen
dstIndex = setjmp( env1 );
// Prüfen, ob wir nicht beim allerersten Durchlauf sind
if( dstIndex != 0 )
{
printf( "Zu 1 gesprungen\n" );
// Bei ungültigem Index wird das Programm beendet
if( dstIndex >= argc )
longjmp( envEnd, -1 );
// Ziel aus 'argv' auslesen
dst = atoi( argv[dstIndex] );
// An das Ziel springen bzw. ans Ende,
// wenn das Ziel nicht gültig ist
switch( dst )
{
case 1: longjmp( env1, dstIndex + 1 );
break;
case 2: longjmp( env2, dstIndex + 1 );
break;
case 3: longjmp( env3, dstIndex + 1 );
break;
default: longjmp( envEnd, dstIndex + 1 );
}
}
// 2. Ziel-Punkt setzen
dstIndex = setjmp( env2 );
if( dstIndex != 0 )
{
printf( "Zu 2 gesprungen\n" );
// Bei ungültigem Index wird das Programm beendet
if( dstIndex >= argc )
longjmp( envEnd, -1 );
// Ziel aus 'argv' auslesen
dst = atoi( argv[dstIndex] );
// An das Ziel springen bzw. ans Ende,
// wenn das Ziel nicht gültig ist
switch( dst )
{
case 1: longjmp( env1, dstIndex + 1 );
break;
case 2: longjmp( env2, dstIndex + 1 );
break;
case 3: longjmp( env3, dstIndex + 1 );
break;
default: longjmp( envEnd, dstIndex + 1 );
}
}
// 3. Ziel-Punkt setzen
dstIndex = setjmp( env3 );
if( dstIndex != 0 )
{
printf( "Zu 3 gesprungen\n" );
// Bei ungültigem Index wird das Programm beendet
if( dstIndex >= argc )
longjmp( envEnd, -1 );
// Ziel aus 'argv' auslesen
dst = atoi( argv[dstIndex] );
// An das Ziel springen bzw. ans Ende,
// wenn das Ziel nicht gültig ist
switch( dst )
{
case 1: longjmp( env1, dstIndex + 1 );
break;
case 2: longjmp( env2, dstIndex + 1 );
break;
case 3: longjmp( env3, dstIndex + 1 );
break;
default: longjmp( envEnd, dstIndex + 1 );
}
}
// End-Ziel-Punkt setzen
dstIndex = setjmp( envEnd );
if( dstIndex == 0 )
{
// Hier beginnt der eigentliche Programmablauf. Alle
// Ziele wurden gesetzt und sind dadurch erreichbar.
// Der Ziel-Index wird um 1 erhöht, da das erste
// Element von 'argv' mit dem Programm-Pfad gefüllt
// ist.
dstIndex++;
printf( "Beginn des Programms\n" );
// Bei ungültigem Index wird das Programm beendet
if( dstIndex >= argc )
longjmp( envEnd, -1 );
// Ziel aus 'argv' auslesen
dst = atoi( argv[dstIndex] );
// An das Ziel springen bzw. ans Ende,
// wenn das Ziel nicht gültig ist
switch( dst )
{
case 1: longjmp( env1, dstIndex + 1 );
break;
case 2: longjmp( env2, dstIndex + 1 );
break;
case 3: longjmp( env3, dstIndex + 1 );
break;
default: longjmp( envEnd, dstIndex + 1 );
}
}
else
{
// Entweder durch eine ungültige Eingabe
// oder durch das Abarbeiten des letzten
// Zieles wurde das Ende erreicht.
printf( "Programm beendet\n" );
}
return 0;
}
\\
Ausgabe:
$ ./exception 1 2 3
Beginn des Programms
Zu 1 gesprungen
Zu 2 gesprungen
Zu 3 gesprungen
Programm beendet
$ ./exception 1 2 3 2 1 4
Beginn des Programms
Zu 1 gesprungen
Zu 2 gesprungen
Zu 3 gesprungen
Zu 2 gesprungen
Zu 1 gesprungen
Programm beendet
$ ./exception
Beginn des Programms
Programm beendet
===== siehe auch =====
[[start|setjmp-Library]]: [[longjmp|longjmp()]], [[jmp_buf|jmp_buf]]