Précédent   Forum du club des développeurs et IT Pro > C et C++ > C
C Forum d'entraide technique sur le langage C. Avant de poster -> F.A.Q. C, Avant de poster.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 03/05/2005, 12h18   #1
ulukahio
Invité régulier
 
Inscription : 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.
ulukahio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 12h32   #2
argoet
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 543
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 543
Points : 473
Points : 473
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
argoet est déconnecté   Envoyer un message privé Réponse avec citation 03
Vieux 03/05/2005, 13h13   #3
ulukahio
Invité régulier
 
Inscription : février 2005
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 37
Points : 6
Points : 6
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.
ulukahio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 13h19   #4
Caine
Membre émérite
 
Avatar de Caine
 
Inscription : mai 2004
Messages : 1 020
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : mai 2004
Messages : 1 020
Points : 949
Points : 949
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.
Caine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 13h32   #5
ulukahio
Invité régulier
 
Inscription : février 2005
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 37
Points : 6
Points : 6
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).
ulukahio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 13h39   #6
Caine
Membre émérite
 
Avatar de Caine
 
Inscription : mai 2004
Messages : 1 020
Détails du profil
Informations personnelles :
Âge : 41

Informations forums :
Inscription : mai 2004
Messages : 1 020
Points : 949
Points : 949
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
Caine est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 13h51   #7
ulukahio
Invité régulier
 
Inscription : février 2005
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 37
Points : 6
Points : 6
Citation:
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 ;-))


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


Citation:
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.

Citation:
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.
ulukahio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 13h57   #8
argoet
Membre éprouvé
 
Avatar de argoet
 
Inscription : mai 2002
Messages : 543
Détails du profil
Informations forums :
Inscription : mai 2002
Messages : 543
Points : 473
Points : 473
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
argoet est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 03/05/2005, 14h15   #9
gege2061
Rédacteur
 
Avatar de gege2061
 
Inscription : juin 2004
Messages : 5 850
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2004
Messages : 5 850
Points : 11 060
Points : 11 060
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é.
__________________
gege2061's blog
gege2061 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/05/2005, 14h17   #10
calogerogigante
Membre éprouvé
 
Avatar de calogerogigante
 
Inscription : avril 2003
Messages : 600
Détails du profil
Informations personnelles :
Âge : 42
Localisation : Belgique

Informations forums :
Inscription : avril 2003
Messages : 600
Points : 453
Points : 453
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...
calogerogigante est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 14h20   #11
Ti-R
Modérateur
 
Avatar de Ti-R
 
Inscription : avril 2003
Messages : 1 669
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2003
Messages : 1 669
Points : 1 957
Points : 1 957
Envoyer un message via ICQ à 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; 
                        } 
            }
} 
//-------------------------------------------------------------
Ti-R est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 03/05/2005, 14h23   #12
calogerogigante
Membre éprouvé
 
Avatar de calogerogigante
 
Inscription : avril 2003
Messages : 600
Détails du profil
Informations personnelles :
Âge : 42
Localisation : Belgique

Informations forums :
Inscription : avril 2003
Messages : 600
Points : 453
Points : 453
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...

;-) ;-) ;-) ;-) ;-)
calogerogigante est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 14h24   #13
DavG
Membre régulier
 
Inscription : mai 2004
Messages : 66
Détails du profil
Informations forums :
Inscription : mai 2004
Messages : 66
Points : 79
Points : 79
Envoyer un message via MSN à DavG Envoyer un message via Yahoo à DavG
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

Citation:
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

Citation:
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" !
DavG est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 03/05/2005, 14h25   #14
gege2061
Rédacteur
 
Avatar de gege2061
 
Inscription : juin 2004
Messages : 5 850
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2004
Messages : 5 850
Points : 11 060
Points : 11 060
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
__________________
gege2061's blog
gege2061 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/05/2005, 14h26   #15
mat.M
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
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 ??

Citation:
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$
  Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 14h26   #16
ulukahio
Invité régulier
 
Inscription : février 2005
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 37
Points : 6
Points : 6
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:

Citation:
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
ulukahio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 14h29   #17
Ti-R
Modérateur
 
Avatar de Ti-R
 
Inscription : avril 2003
Messages : 1 669
Détails du profil
Informations personnelles :
Âge : 33

Informations forums :
Inscription : avril 2003
Messages : 1 669
Points : 1 957
Points : 1 957
Envoyer un message via ICQ à Ti-R
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();
Ti-R est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 14h30   #18
gege2061
Rédacteur
 
Avatar de gege2061
 
Inscription : juin 2004
Messages : 5 850
Détails du profil
Informations personnelles :
Âge : 29
Localisation : France, Indre et Loire (Centre)

Informations forums :
Inscription : juin 2004
Messages : 5 850
Points : 11 060
Points : 11 060
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.
__________________
gege2061's blog
gege2061 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/05/2005, 14h32   #19
calogerogigante
Membre éprouvé
 
Avatar de calogerogigante
 
Inscription : avril 2003
Messages : 600
Détails du profil
Informations personnelles :
Âge : 42
Localisation : Belgique

Informations forums :
Inscription : avril 2003
Messages : 600
Points : 453
Points : 453
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:

Citation:
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...
calogerogigante est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/05/2005, 14h32   #20
ulukahio
Invité régulier
 
Inscription : février 2005
Messages : 37
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 37
Points : 6
Points : 6
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...
ulukahio est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h50.


 
 
 
 
Partenaires

Hébergement Web