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


Sujet :

C

  1. #1
    Membre à l'essai
    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é
    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
    Signé : Capitaine Jean-Luc Picard

  3. #3
    Membre à l'essai
    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é
    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
    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é
    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
    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é
    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
    Signé : Capitaine Jean-Luc Picard

  9. #9
    Rédacteur

    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é
    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
    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é
    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
    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" !
    - Je suis fascine par l'air. Si on enlevait l'air du ciel, tous les oiseaux tomberaient par terre....Et les avions aussi....
    - Si tu travailles avec un marteau-piqueur pendant un tremblement de terre, désynchronise-toi, sinon tu travailles pour rien.
    JC Vandamme.

  14. #14
    Rédacteur

    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)
    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
    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
    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

    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é
    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
    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...