IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

remplacer le goto


Sujet :

C

  1. #1
    Halobox
    Invité(e)
    Par défaut remplacer le goto
    Hello,

    Je débute en C, (j'ai quelques bases dans d'autres languages) et enfaite, mon prof m'a demander de faire un petit prog, et comme pas mal de personnes, il ne veut pas de goto.

    Donc voila, je voudrais savoir comment dans certains cas (erreurs) je pourrai "redemarer" le programme, merci.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: remplacer le goto
    Citation Envoyé par Halobox
    Je débute en C, (j'ai quelques bases dans d'autres languages) et en fait, mon prof m'a demander de faire un petit prog, et comme pas mal de personnes, il ne veut pas de goto.

    Donc voila, je voudrais savoir comment dans certains cas (erreurs) je pourrai "redemarer" le programme, merci.
    Il faut raisonner de façon algorithmique (actions conditionelles, structures de boucles) et non en termes de 'sauts' qui est un héritage de l'assembleur et des vieux BASICs.
    • if
    • if-else
    • switch-case
    • while
    • do-while
    • for

    Avec ça, on peut tout faire.

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    bonsoir

    tu peux avoir quelque chose qui ressemble a cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    unsigned int Mon_Programme(){
     
     //Point d'entrée de ton programme
     //Affichage des menus
     //initialisation de variable de fichier de configuration
     //traitement à réaliser
    }
    int main() {
     
    unsigned int redemarrer = 1
     
    do {
      redemarrer=Mon_Programme();
    }
    while( redemarrer )  
    return 0;
    }

  4. #4
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    101
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 101
    Par défaut
    C'est vrai, le GOTO c'est déconseillé en C (c'est surtout que le débuggeur aime pas je crois).

  5. #5
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par phoenix440
    C'est vrai, le GOTO c'est déconseillé en C (c'est surtout que le débuggeur aime pas je crois).
    Non, rien à voir. C'est une question de conception du code. Le C a des structures de code algorithmiques, il est donc logique que le goto ne soit pas utilisé (surtout vers le haut)..

    En revance, il peut simplifier certains traitements d'erreur... Mais j'évite...

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Emmanuel :
    le goto ne soit pas utilisé (surtout vers le haut)..
    Oh , surtout pas !!! (si vous êtes vicieux et si vous aimez ça, faîtes du Fortran style Fortran IV ou Basic archaïque!).
    MAIS, il ne faut pas être raciste avec le goto: Il est très utile pour faire un programme incompréhensible et plus efficace que n'importe quoi pour crypter un programme de plus de 100 lignes

    Emmanuel :
    En revance, il peut simplifier certains traitements d'erreur... Mais j'évite...
    C'est finalement le seul cas tolérable : la sortie d'urgence, ... si on n'a pas d'autres solutions
    En bref et sans plaisanteries, Emmanuel A RAISON

  7. #7
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Citation Envoyé par Emmanuel
    En revance, il peut simplifier certains traitements d'erreur... Mais j'évite...
    C'est finalement le seul cas tolérable : la sortie d'urgence, ... si on n'a pas d'autres solutions
    En bref et sans plaisanteries, Emmanuel A RAISON
    et encore.... pour etre propre, il faut utiliser les mecanismes appropriés (encore qu'en C...) je cite setjmp et longjmp (sauts non locaux).
    Pour faire bref, je dirai que goto ne sert plus a rien dans un langage comme le C.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 394
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 394
    Par défaut
    Euh... franchement, setjmp et longjmp sont bannis par la plupart des profs qui enseignent le C...

    Il faut dire que pour être propre, il doit respecter un critère précis: il ne faut sauter que vers une fonction appelante, car setjmp ne sauvegarde pas toute la pile, (généralement, le pointeur de pile seulement, je crois, plus les différents registres)
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Patriarch24
    et encore.... pour etre propre, il faut utiliser les mecanismes appropriés (encore qu'en C...) je cite setjmp et longjmp (sauts non locaux).
    Pour faire bref, je dirai que goto ne sert plus a rien dans un langage comme le C.
    setjmp() et longjmp() peuvent servir à implémenter un mécanisme d'exception, mais est-ce que ça a un intérêt ?

    Sinon, je m'en suis servi pour réaliser un commutateur de tâches (x86 mode réel), mais au prix d'une extension en assembleur pour modifier la pile et masquer/démasquer les IT... Bref, de la bidouille interdite sur OS 'moderne'.

  10. #10
    Membre émérite
    Avatar de Pouic
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    669
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2004
    Messages : 669
    Par défaut
    Disons que lorsqu'on écrit un compilateur, ça peut être sympa de restaurer le contexte grâce à ces fonctions...
    Software becomes slower faster than hardware becomes faster
    [size=1]
    http://xrenault.developpez.com

  11. #11
    Halobox
    Invité(e)
    Par défaut
    Merci a vous tous, j'ai réussi à revenir au début du prog avec un while, masi je suis qd même obliogé, d'écir le message d'erreur plusieur fois.

    Merci

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Halobox
    Merci a vous tous, j'ai réussi à revenir au début du prog avec un while, masi je suis qd même obliogé, d'écir le message d'erreur plusieur fois.
    Euh, bizarre. Montre ton code, on doit pouvoir améliorer...

  13. #13
    Halobox
    Invité(e)
    Par défaut
    En gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Variables
        int erreur = 1;
     
     
        while (erreur == 1){
        erreur = 0;
    Ensuite j'ai mon code et a chaque fois que je trouve une erreur j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf("\nVous avez du faire une faute de frappe.\a\n\n");
                                  system ("PAUSE");
                                  system ("cls");
                                  erreur = 1;
    Et ensuite je ferme le while et j'affiche le résultat.

  14. #14
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Halobox
    En gros
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    //Variables
        int erreur = 1;
     
     
        while (erreur == 1){
        erreur = 0;
    Ensuite j'ai mon code et a chaque fois que je trouve une erreur j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf("\nVous avez du faire une faute de frappe.\a\n\n");
                                  system ("PAUSE");
                                  system ("cls");
                                  erreur = 1;
    Et ensuite je ferme le while et j'affiche le résultat.
    C'est pas bien clair. On ne peut pas avoir le code complet ? A vue de nez, un do-while serait plus adapté...

  15. #15
    Membre Expert
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Par défaut
    Euh... franchement, setjmp et longjmp sont bannis par la plupart des profs qui enseignent le C...

    Il faut dire que pour être propre, il doit respecter un critère précis: il ne faut sauter que vers une fonction appelante, car setjmp ne sauvegarde pas toute la pile, (généralement, le pointeur de pile seulement, je crois, plus les différents registres)
    Evidemment il ne faut pas faire n'importe quoi , bien lire les docs, et ne pas supposer des trucs [faux]
    d'autre part, ca m'etonnerait qu'on saute avec un goto vers une autre fonction

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 4
    Par défaut
    J'me demande si c'est necessaire de redémarrer un programme s'il y a une erreur dedans plutot que de chercher à contourner cette erreur moi... (particulièrement si t'as des allocations et autres qui trainent dans le coin)

    Et sinon effectivement un do-while est plus adapté (ça sert à rien de tester si une erreur est présente avant meme que la premiere "itération" ait eu lieu, si? )

    Ensuite j'ai mon code et a chaque fois que je trouve une erreur j'ai :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    printf("\nVous avez du faire une faute de frappe.\a\n\n");
                                  system ("PAUSE");
                                  system ("cls");
                                  erreur = 1;
    Et ensuite je ferme le while et j'affiche le résultat.
    Ton mécanisme n'était pas censé re-executer ton code si une erreur avait lieu?

  17. #17
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Pourquoi a la place de ton horrible system("pause") tu ne fais pas un getchar() ?

    Comment cela des que tu taperas sur une touche tu effaceras l'ecran.

Discussions similaires

  1. [XL-2013] Utilisation GoTo & AddressOf - Remplacer "Texte" par Texte
    Par Invité dans le forum Macros et VBA Excel
    Réponses: 22
    Dernier message: 24/07/2013, 16h01
  2. [Débutant] Comment remplacer un "Goto"
    Par Jah73 dans le forum VB.NET
    Réponses: 2
    Dernier message: 07/11/2012, 08h42
  3. Réponses: 2
    Dernier message: 12/06/2011, 07h34
  4. Probleme pour remplacer une goto par une getURL!
    Par romeoverso dans le forum Flash
    Réponses: 2
    Dernier message: 16/04/2008, 06h16
  5. Probleme pour remplacer une goto par une getURL!
    Par romeoverso dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/04/2008, 09h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo