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 :

Que pensez vous du goto [Débat]


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut Que pensez vous du goto
    Bonjour à tous, je me trouve devant un problème, à savoir que partout où je vais on me dit: "bouuh n'utilise pas goto c'est illisible, c'est nul, et en plus c'est pas bien". Mais voilà, je me suis donc débrouillé sans jusqu'à maintenant, mais je pense que pour ce que je dois faire l'utilisation de goto rendrait les choses plus claires.

    En effet, je récupère une base de données en C sachant que les champs vides ne sont pas dans la base de départ. Donc quand je ne détecte pas un champ, je dois sauter toute une partie de mon code (qui traite les champ qui ne sont pas la), pour aller vers le reste.

    Pourquoi un goto ne serait pas indiqué dans ce cas la? Je veux bien faire des tests avec des indices et compagnie mais je pense qu'un goto serait nettement plus clair, même pour les relecteurs.
    D'avance merci.

  2. #2
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    La regle : Pas de goto dans un programme

    La valeur d'un programmeur est inversement proportionnel au nombre de goto que l'on trouve dans son code

    Pour clarifier ton programme Utilise les sous programmes avec les commentaire qui vont bien

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par argoet
    La regle : Pas de goto dans un programme
    oui bon je veux bien la croire ta règle, mais tu me répètes un peu ce que j'ai dit en haut ("les gotos c'est pas bien")... J'aimerai juste savoir pourquoi... Et pourquoi alors a-t-on implémenté le goto si c'est complètement inutile, voire dangereux?
    J'ai pas demandé ce que vous pensiez du goto, j'ai demandé pourquoi vous pensiez qu'il fallait/ne fallait pas l'utiliser.

  4. #4
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    L'utilisation de goto casse le principe même de programmation structurée.

    Ca pose d'énormes problèmes en preuve algorithmique, de plus l'état du programme peut devenir indéterminé dans un contexte multi-thread.

    De toute manière, pour utiliser goto, il faut des branchements, autant utiliser ceux-ci pour "piloter" les portions de code à exécuter.

    Dans le cadre de boucle, il est aussi lisible et efficace d'utiliser des clauses break, continue, return.

    Le goto est un héritage de l'assembleur, rappelons que le C est un macor-assembleur avant de se vouloir un langage de haut niveau.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Caine
    L'utilisation de goto casse le principe même de programmation structurée.

    Ca pose d'énormes problèmes en preuve algorithmique, de plus l'état du programme peut devenir indéterminé dans un contexte multi-thread.

    De toute manière, pour utiliser goto, il faut des branchements, autant utiliser ceux-ci pour "piloter" les portions de code à exécuter.

    Dans le cadre de boucle, il est aussi lisible et efficace d'utiliser des clauses break, continue, return.

    Le goto est un héritage de l'assembleur, rappelons que le C est un macor-assembleur avant de se vouloir un langage de haut niveau.
    Alors je vais répondre point par point, le problème de preuve ne me dérange pas outre mesure dans mon cas, je ne fais pas de multithreading, ce n'est pas dans une boucle, et justement ce que je fais dans mon programme est vraiment très proche de ce que je fais en assembleur, vu que je fais de l'acquisition en binaire, et donc que je me déplace d'octets en octets sur un fichier sans jamais utiliser rien de plus complexe qu'un for ou un if... (bon des fprintf ok mais ça va pas très loin).

  6. #6
    Membre éprouvé Avatar de Caine
    Inscrit en
    Mai 2004
    Messages
    1 028
    Détails du profil
    Informations personnelles :
    Âge : 52

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 028
    Points : 1 122
    Points
    1 122
    Par défaut
    Je te conseilles de faire une recherche sur le net sur le sujet.

    J'avoue que ça fait trop longtemps que j'ai quitté les bancs de la FAC pour me souvenir des raisons exhaustives et exactes de ne pas utiliser GOTO.

    Mais après tout teste avec goto, en debug etc... Je ne suis pas intégriste sur ce point, mais je me souviens juste qu'un programme perd le côté structuré avec goto.

    On peut arrivé à une étiquette par oubli de branchement sur une sortie ou sur une autre étiquette.

    Ceci peut être désastreux, immagines que tu arrives là où tu utilises un pointeur alors qu'il n'est pas initialisé.

    Enfin, en programmation structurée, ça arrive aussi.

    Si tu trouves un site bien fait parlant du problème, je suis intéressé.

    Bon GOTO

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Mais après tout teste avec goto, en debug etc... Je ne suis pas intégriste sur ce point, mais je me souviens juste qu'un programme perd le côté structuré avec goto.
    Oui je vais tester, je verrai bien si c'est complètement aberrant (ce qui m'étonnerait fort ;-))


    On peut arrivé à une étiquette par oubli de branchement sur une sortie ou sur une autre étiquette.
    Je n'oublie jamais rien 8)


    Ceci peut être désastreux, immagines que tu arrives là où tu utilises un pointeur alors qu'il n'est pas initialisé.
    Je n'utilise même pas de pointeurs dans mon programme.

    Si tu trouves un site bien fait parlant du problème, je suis intéressé.
    Ok je vous tiens au courant. Merci beaucoup pour ta réponse, c'est très sympa, je vais tenter de rechercher.

  8. #8
    Membre confirmé
    Avatar de argoet
    Inscrit en
    Mai 2002
    Messages
    582
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 582
    Points : 562
    Points
    562
    Par défaut
    Citation Envoyé par ulukahio
    Citation Envoyé par argoet
    La regle : Pas de goto dans un programme
    oui bon je veux bien la croire ta règle, mais tu me répètes un peu ce que j'ai dit en haut ("les gotos c'est pas bien")... J'aimerai juste savoir pourquoi... Et pourquoi alors a-t-on implémenté le goto si c'est complètement inutile, voire dangereux?
    J'ai pas demandé ce que vous pensiez du goto, j'ai demandé pourquoi vous pensiez qu'il fallait/ne fallait pas l'utiliser.
    Le goto à été écrit à une époque ou les sous programmes , les boucles et autres instruction "structuré" n'existaient pas

    Reprends l'un des premiers basic microsoft (Dans les années 80-81)
    Pour boucler un dizaine de fois tu faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    10 I=0
    20 I = I + 1
    30 PRINT I
    40 IF I < 10 Then GOTO 20 
    50 END
    Bon ben maintenant tu admettras que cette façon de faire n'est plus d'actualité (surtout avec le C)

    CQFD

  9. #9
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Pour faire simple: je ne suis pas du tout d'accord avec toi argoet (et tout ceux qui pense la même chose que toi!):
    Citation Envoyé par argoet
    Le goto à été écrit à une époque ou les sous programmes , les boucles et autres instruction "structuré" n'existaient pas
    Dans ce cas pourquoi l'avoir repri dans des langages récents tel que le C# : surtout qu'il existe des langage sans goto.

    Les goto rendent le code illisible lorsqu'il sont mal utilisé mais ce n'est pas une exception en C. Il ne sont pas plus dangereux que des appels à malloc mal construit.

    Je n'est jamais eu à utilisé de goto dans mes codes en C mais ce n'est pas par peur de les utiliser mais parce que je n'en ai pas besoin. Il sont trés utiles pour sortir d'une multitude de boucle imbréqué.

  10. #10
    Membre confirmé Avatar de calogerogigante
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 516
    Points
    516
    Par défaut
    Moi, personnellement, les goto, je les utilise !!

    Modérement, mais je les utilise quand même...

    Parfois, c'est bien pratique pour faire des petits tests, et je n'ai aucune honte, ni aucun problème à les utiliser quand c'est nécessaire...

    Exemple très fréquents dans mes programmes personnels :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //-------------------------------------------------------------
    int testouinon(void) // renvoit 1 si oui, renvoit 0 si non.
    {
    int ch;
     
    testOUIouNON:
    ch=getch();
    switch (ch) {
                case 'o': return 1;
                case 'n': return 0;
                 default: goto testOUIouNON;
                }
    }
    //-------------------------------------------------------------
    Ca n'a jamais planté, ni ralentit mon application...

    FAUT JUSTE VEILLER A NE PAS TROP MULTIPLIER LEUR USAGE, POUR EVITER QUE TON CODE NE DEVIENNE ILLISIBLE...

  11. #11
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    C'est dangereux et cela ne sert à rien

    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
    //------------------------------------------------------------- 
    int testouinon(void) // renvoit 1 si oui, renvoit 0 si non. 
    { 
                int ch; 
                while(1)
                {
                            ch=getch(); 
                            switch (ch)
                            { 
                                        case 'o': return 1; 
                                        case 'n': return 0; 
                            } 
                }
    } 
    //-------------------------------------------------------------

  12. #12
    Membre confirmé Avatar de calogerogigante
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 516
    Points
    516
    Par défaut
    Je vois pas ce que cela a de dangereux...

    D'accord avec ton code !!
    Mais je trouve quand même le mien bien plus lisible avec ce petit label, et ce petit goto...

    ;-) ;-) ;-) ;-) ;-)

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2004
    Messages : 66
    Points : 90
    Points
    90
    Par défaut
    Citation Envoyé par argoet
    La regle : Pas de goto dans un programme
    Moi je dis : pas de goto pour ceux qui n'ont pas encore compris les principes du C .. par contre bien utilisé ça peut s'avérer utile comme par exemple dans un code très long pour rejoindre facilement un point de sortie en erreur dans la même fonction, mais bon, faut savoir s'en servir

    La valeur d'un programmeur est inversement proportionnel au nombre de goto que l'on trouve dans son code
    Ça, c'est ce que disent ceux qui ne comprennent pas l'interêt des goto

    Pour clarifier ton programme Utilise les sous programmes avec les commentaire qui vont bien
    Tu veux dire "sous-routines"?? Parfois tu ne veux pas appeler une sous-routine, surtout que tu ne peux pas toujours compiler inline et qu'une sous-routine va prendre plus de temps qu'un simple "goto error" !

  14. #14
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Citation Envoyé par Ti-R
    C'est dangereux et cela ne sert à rien

    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
    //------------------------------------------------------------- 
    int testouinon(void) // renvoit 1 si oui, renvoit 0 si non. 
    { 
                int ch; 
                while(1)
                {
                            ch=getch(); 
                            switch (ch)
                            { 
                                        case 'o': return 1; 
                                        case 'n': return 0; 
                            } 
                }
    } 
    //-------------------------------------------------------------
    Par contre je suis entièrement d'accord que si l'on peut s'en passer autant le faire. Et les goto ne sont pas plus dangereux d'un getch

  15. #15
    mat.M
    Invité(e)
    Par défaut
    Citation Envoyé par argoet
    La regle : Pas de goto dans un programme
    est-ce que tu sais ce que c'est le language assembleur et notamment celui du x86
    A quoi servent les instructions JMP , JGE etc ?? ( language C=assembleur haut niveau )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    MOV AX,200
    decr_ax:
    DEC AX
    CMP AX,10
    JBE decr_ax
    qu'est-ce qu'on fait ici ??

    La valeur d'un programmeur est inversement proportionnel au nombre de goto que l'on trouve dans son code
    tiens ......tiens .....et dans quel livre cette maxime est statuée ??


    C'est vrai il faut éviter les goto mais parfois c'est bien utile .....
    Dans les exemples du SDK de Direct X il y a utilisation de quelques goto .
    Ils sont vraiment mauvais programmeurs alors chez M$

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Oui je suis d'accord avec toi, mais ce n'est pas dans ce type de circonstances que je compte utiliser goto.

    (on est à l'intérieur d'une boucle while qui lit une par une les lignes d'un fichier texte)

    Si quelqu'un pouvait me donner un code propre et sûr correspondant à celui ci:

    if (ligne[i]==2) //le chiffre correspond au nombre de champs non présents dans la base d'origine
    goto champ2;
    else if (ligne[i]==3)
    goto champ3;
    else{ //traitement du champ1}

    champ2: //traitement du champ2

    if (ligne[i]==1)
    goto champ3;

    champ3: //traitement du champ 3

  17. #17
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (ligne[i]==2) //le chiffre correspond au nombre de champs non présents dans la base d'origine 
            fonction_champ2(); 
    else if (ligne[i]==3) 
            fonction_champ3(); 
    else{ fonction_champ1()} 
    if (ligne[i]==1) 
            fonction_champ3();

  18. #18
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Points : 11 625
    Points
    11 625
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( ligne[i] == 2 )
    {  /* traitement du champ2 */ }
    else if ( lign[i] == 1 || ligne[i]==3 )
    { /* traitement du champ3 */ }
    else{ /* traitement du champ1 */}

    la même avec les switch:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    switch( ligne[i] )
    {
      case 2:
        /* traitement du champ2 */
      break;
      case 1:
      case 3:
        /* traitement du champ3 */
      break;
      default:
        /* traitement du champ1 */
      break;
    }
    Si les sont peu utiliser c'est qu'ils sont facilement remplassable.

  19. #19
    Membre confirmé Avatar de calogerogigante
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2003
    Messages
    602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2003
    Messages : 602
    Points : 516
    Points
    516
    Par défaut
    Citation Envoyé par ulukahio
    Oui je suis d'accord avec toi, mais ce n'est pas dans ce type de circonstances que je compte utiliser goto.

    (on est à l'intérieur d'une boucle while qui lit une par une les lignes d'un fichier texte)

    Si quelqu'un pouvait me donner un code propre et sûr correspondant à celui ci:

    if (ligne[i]==2) //le chiffre correspond au nombre de champs non présents dans la base d'origine
    goto champ2;
    else if (ligne[i]==3)
    goto champ3;
    else{ //traitement du champ1}

    champ2: //traitement du champ2

    if (ligne[i]==1)
    goto champ3;

    champ3: //traitement du champ 3
    Là par contre, en effet, je trouve déjà l'utilisation du goto risquée... Très risquée...

    Plutôt d'accord avec les propositions des deux posts au-dessus de celui-ci...

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2005
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 37
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par gege2061
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if( ligne[i] == 2 )
    {  /* traitement du champ2 */ }
    else if ( lign[i] == 1 || ligne[i]==3 )
    { /* traitement du champ3 */ }
    else{ /* traitement du champ1 */}
    iagine ce que ça donne avec une centaine de champs, quand tous saufs le dernier ne sont pas présents.... tu marques un if avec cent tests dedans? Pas très lisible tout ça...

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 18 1234511 ... DernièreDernière

Discussions similaires

  1. Que pensez-vous des générateurs de doc PHP ?
    Par Nonothehobbit dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 64
    Dernier message: 10/07/2007, 11h17
  2. Que pensez vous de filemaker
    Par thpopeye dans le forum Autres SGBD
    Réponses: 4
    Dernier message: 14/06/2007, 16h20
  3. Que pensez vous du nouveau kernel 2.6 ?
    Par GLDavid dans le forum Administration système
    Réponses: 58
    Dernier message: 02/08/2004, 16h45
  4. [Débat] Que pensez-vous des langages à typage dynamique?
    Par Eusebius dans le forum Langages de programmation
    Réponses: 14
    Dernier message: 16/06/2004, 13h12
  5. Que pensez vous du mariage ASP Flash?
    Par tyma dans le forum Flash
    Réponses: 4
    Dernier message: 09/07/2003, 16h00

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