Super goto

Soyez le premier à donner votre avis sur cette source.

Snippet vu 3 245 fois - Téléchargée 33 fois

Contenu du snippet

On dit souvent que fair des goto ce n'est pas bien ...
Mais il y a un goto assez special qui lui est tout a fait acceptable, et qui est HYPER utile pour par exemple les getions d'erreur !

Voici un exemple de ce que j'appelle un SUPER GOTO (magnifique).

Source / Exemple :


#include <stdio.h>
#include <conio.h>
#include <setjmp.h>
// --------------------------------------------
void FunctionWhereError(jmp_buf jumpIfError)
{
// ici une fonction avec si vous voulez plein de calcul
// met on va dire qu l'on a fait une division par 0
// on retourne (pourquoi pas 154)
longjmp(jumpIfError,154);
}
// --------------------------------------------
int main(int argc,char **argv)
{
jmp_buf jump;
int     r;

if(!(r = setjmp(jump)))
  {
  printf("Ici on est dans le bloc 'TRUE' du 'if'\n");
  // on appelune fonction ou il y a une erreur
  FunctionWhereError(jump);
  }
else
  {
  printf("Ici on est dans le bloc 'FALSE' du 'if'\n");
  printf("Le 'setjump' a retourner le code %d\n",r);
  }

printf("N'est-ce pas merveilleux ?\n");
getch();
return 0;
}
// le premier fois le 'setjmp' initialise 'jump' et retourne 0
// Il enregistre ou il en est dans le programme
// Donc lorque l'on fait 'longjmp', il va dans la structure
// 'jumpIfError' ou il y a toutes les donnees enregistrees
// il va donc au 'setjmp' et retourne son second paramtre 154
// donc on tombe sur le 'else' !

A voir également

Ajouter un commentaire

Commentaires

Messages postés
1138
Date d'inscription
mardi 10 juin 2003
Statut
Membre
Dernière intervention
25 janvier 2009
3
Ho mais pas du tout, comment je ne fais pas du C++, mais tu C, cela n'est pas a eviter, au contraire, c'est grandement utile danc des cas. (par exemple gestion des erreurs)
Messages postés
1878
Date d'inscription
jeudi 16 octobre 2003
Statut
Membre
Dernière intervention
16 mars 2011
1
en clair, C du try catch

Bien pr ces fonctions que l'on ne connaissais pas...

qu : est-ce du standard C?

cela permetra les try ds du C pur...


Ceci dit : voici le commentaire des MSDN :

Do not use setjmp and longjmp in C++ programs; these functions do not support C++ object semantics. Also, using these functions in C++ programs may degrade performance by preventing optimization on local variables. Use the C++ exception handling try/catch constructs instead.


If you do use setjmp/longjmp in a C++ program, the interaction between these functions and C++ exception handling requires that you include SETJMP.H or SETJMPEX.H. Destructors for local objects will be called during the stack unwind if you compile with the /GX (Enable Exception Handling) option. Also, if you intend your code to be portable, do not rely on correct destruction of frame-based objects when executing a nonlocal goto using a call to longjmp.


C dc qd mm a éviter...
++
Magicalement,
Nono.
Messages postés
527
Date d'inscription
vendredi 14 septembre 2001
Statut
Membre
Dernière intervention
6 octobre 2008
3
Nebula => je me suis fié à la catégorie dans laquelle le source a été posté
Messages postés
1
Date d'inscription
mercredi 10 décembre 2003
Statut
Membre
Dernière intervention
24 mars 2004

Super! Merci pour la syntaxe!
Messages postés
787
Date d'inscription
samedi 8 juin 2002
Statut
Membre
Dernière intervention
7 juin 2007
1
Mouais, on vit très bien sans, même si c'est assez utile, c'est assez confus quand même...

GoldenEye > des try/catch en C ? mais bien sur...
Afficher les 7 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.