Publicité
+ Répondre à la discussion
Page 1 sur 18 1234511 ... DernièreDernière
Affichage des résultats 1 à 20 sur 341
  1. #1
    Invité régulier
    Inscrit en
    février 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 37
    Points : 6
    Points
    6

    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 éprouvé Avatar de argoet
    Inscrit en
    mai 2002
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 547
    Points : 444
    Points
    444

    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
    Signé : Capitaine Jean-Luc Picard

  3. #3
    Invité régulier
    Inscrit en
    février 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 37
    Points : 6
    Points
    6

    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 émérite Avatar de Caine
    Inscrit en
    mai 2004
    Messages
    1 024
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : mai 2004
    Messages : 1 024
    Points : 951
    Points
    951

    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
    Invité régulier
    Inscrit en
    février 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 37
    Points : 6
    Points
    6

    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 émérite Avatar de Caine
    Inscrit en
    mai 2004
    Messages
    1 024
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : mai 2004
    Messages : 1 024
    Points : 951
    Points
    951

    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
    Invité régulier
    Inscrit en
    février 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 37
    Points : 6
    Points
    6

    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 éprouvé Avatar de argoet
    Inscrit en
    mai 2002
    Messages
    547
    Détails du profil
    Informations forums :
    Inscription : mai 2002
    Messages : 547
    Points : 444
    Points
    444

    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 :
    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
    Avatar de gege2061
    Inscrit en
    juin 2004
    Messages
    5 845
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : juin 2004
    Messages : 5 845
    Points : 10 238
    Points
    10 238

    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 éprouvé Avatar de calogerogigante
    Profil pro
    Inscrit en
    avril 2003
    Messages
    600
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2003
    Messages : 600
    Points : 453
    Points
    453

    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 :
    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 Expert Avatar de Ti-R
    Inscrit en
    avril 2003
    Messages
    1 672
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : avril 2003
    Messages : 1 672
    Points : 1 960
    Points
    1 960

    Par défaut

    C'est dangereux et cela ne sert à rien

    Code :
    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 éprouvé Avatar de calogerogigante
    Profil pro
    Inscrit en
    avril 2003
    Messages
    600
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2003
    Messages : 600
    Points : 453
    Points
    453

    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
    Inscrit en
    mai 2004
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : mai 2004
    Messages : 66
    Points : 79
    Points
    79

    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
    Inscrit en
    juin 2004
    Messages
    5 845
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : juin 2004
    Messages : 5 845
    Points : 10 238
    Points
    10 238

    Par défaut

    Citation Envoyé par Ti-R
    C'est dangereux et cela ne sert à rien

    Code :
    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 :
    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
    Invité régulier
    Inscrit en
    février 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 37
    Points : 6
    Points
    6

    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 Expert Avatar de Ti-R
    Inscrit en
    avril 2003
    Messages
    1 672
    Détails du profil
    Informations personnelles :
    Âge : 34

    Informations forums :
    Inscription : avril 2003
    Messages : 1 672
    Points : 1 960
    Points
    1 960

    Par défaut

    Code :
    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
    Inscrit en
    juin 2004
    Messages
    5 845
    Détails du profil
    Informations personnelles :
    Âge : 30

    Informations forums :
    Inscription : juin 2004
    Messages : 5 845
    Points : 10 238
    Points
    10 238

    Par défaut

    Code :
    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 :
    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 éprouvé Avatar de calogerogigante
    Profil pro
    Inscrit en
    avril 2003
    Messages
    600
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : Belgique

    Informations forums :
    Inscription : avril 2003
    Messages : 600
    Points : 453
    Points
    453

    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
    Invité régulier
    Inscrit en
    février 2005
    Messages
    37
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 37
    Points : 6
    Points
    6

    Par défaut

    Citation Envoyé par gege2061
    Code :
    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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •