drdd
Messages postés7Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 5 septembre 2005
-
30 août 2005 à 18:02
drdd
Messages postés7Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 5 septembre 2005
-
5 sept. 2005 à 20:36
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
drdd
Messages postés7Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 5 septembre 2005 5 sept. 2005 à 20:36
Oops! j'ai mis : "la proscription du Goto par mon professeur"... je voulais en fait parler des return*s*... Comme quoi il ne faut pas écrire quand on a quelque chose d'autre en tête ^_^
Et en réponse à BugMaker : j'ai commencé la "programmation" avec les fichiers BATCH (les .BAT) sous DOS... Donc, on peut dire que j'en ai utilisé des GOTO*s*, et en quantité! (Ben oui: sous la version 6.22, on ne savait même pas faire de boucle! Ah! si j'avais connu Linux plus tôt...). Alors je n'ai rien contre les GOTO*s*...
Mais je dois quand même admettre qu'il est plus facile de se perdre et du prouire du code "spaghetti" avec des GOTO*s* qu'avec autre chose... Et je dis ça par expérience! Donc, à mon avis en tout cas,
"GOTO : seulement en cas d'urgence!"
PS : juste au cas où mon humour serait ENCORE pire que ce que je ne le pensait, je voulais dire par là qu'il vaut mieux les éviter tant qu'à faire, mais pas au point de devenir maniaque. A mon avis.
BugMaker
Messages postés34Date d'inscriptionvendredi 17 janvier 2003StatutMembreDernière intervention 6 février 2008 5 sept. 2005 à 20:01
salut,
ca n'est pas parce qu'un code est truffé de GOTO qu'il n'est pas lisible. j'ai programmé pendant 15 ans en cobol et on ne m'a jamais dit que mon code n'était pas lisible. on peut aussi faire du code "spagetti" sans utiliser un seul GOTO.
drdd
Messages postés7Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 5 septembre 2005 1 sept. 2005 à 18:58
Je suis d'accord avec le "le meilleur code sera celui qui arrive le plus vite au résultat escompté" s'il s'agit uniquement de programmation... En fait, le problème arrive pour les mise-à-jours et les modifications... Dans ce cas, c'est pas si mal d'avoir un code avant tout LISIBLE ^_^
Et pour Cyberboy2054 : je crois que j'ai une piste quant au pourquoi de la proscription du Goto par mon professeur (est-ce bien français, tout ça ?) : je ne suis qu'en première année (enfin... 2e maintenant) et vu que le niveau de la classe n'est pas très élevé (bel euphémisme s'il en est) ça pourrait expliquer qu'il insiste pour avoir des programmes ne comprenant qu'une rentrée et une sortie : plus simple et donc moins de risque d'erreur. Et c'est vrai que nous n'avons pas encore eu de programme "nécessitant" un système avec plusieurs return*s* (ou ... Goto*s*).
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 août 2019 1 sept. 2005 à 16:19
Il n'y a rien à proscrire, suffit de répondre 'oui' aux censeurs tant qu'on y est obligé, ensuite le meilleur code sera celui qui arrive le plus vite au résultat escompté.
Cyberboy2054
Messages postés173Date d'inscriptionjeudi 20 décembre 2001StatutMembreDernière intervention22 août 2008 1 sept. 2005 à 15:16
Je n'étais pas au courant que return était une instruction à proscrire, mais je suis curieux de savoir pourquoi.
Je l'ai pourtant croisé bon nombre de fois dans des sources que j'ai lues pour sortir prématuremment d'une fonction, et souvent cette solution apparaissait plus élégante que l'utilisation d'un goto ou autre...
drdd
Messages postés7Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 5 septembre 2005 31 août 2005 à 19:13
En réponse à Cyberboy2054 :
Oui, en effet, je savais que le Goto était à proscrire (la première chose qu'on nous apprend, c'est que le Goto est LA commande universelle par exellence, mais qu'il ne faut JAMAIS l'utiliser ^_^) ;
mais on m'avait aussi dit qu'il en était de même pour leS (attention au "S") return... Notre professeur insiste pour avoir UN point de départ et UN point d'arrivée... Et il était hors de question que je fasse 5 "IF-THEN-ELSE" imbriqués!
Enfin, je suis d'accord, la solution avec plusieurs return donne mieux...
Je m'en vais de ce pas modifer le code.
Merci du coup de main.
Cyberboy2054
Messages postés173Date d'inscriptionjeudi 20 décembre 2001StatutMembreDernière intervention22 août 2008 30 août 2005 à 23:20
Juste 2-3 trucs que j'ai vu en lisant ta source.
Tu utilise à plusieurs reprise "goto erreur". On a sans doute déja du te dire qu'en C c'est une instruction à éviter d'utiliser, car dans la plupart des cas, elle provient d'une erreur de conception de la fonction qui la contient. Ici, tu t'en sers pour afficher un message d'erreur, puis sortir de la fonction car on se retrouve à la fin.
Pourquoi ne pas plutot remplacer
if (!(argc>1)) { err_num=1; goto erreur;}
par
if (!(argc>1))
{
printf("\nEt si vous précisiez un fichier, pour voir ?\n");
return 0;
}
Je trouve cela plus logique: "return" indique de manière explicite que l'on sort de la fonction, alors qu'avec goto il faut se balader dans le fichier pour retrouver la logique que tu as voulu imposer ...
Au passage, un truc que je n'ai pas compris, tu mets un code d'erreur (5, a la fin de la source), qui n'est pas present dans le switch de traitement des erreurs ... une erreur que tu aurais pu éviter avec ma méthode :p
Un dernier problème de logique:
!(argc > 1) == (argc <= 1) :p
On dit plus couramment "est inférieur ou égal à 1" que "n'est pas superieur à 1". Evidemment c'est pas grave mais c'est pas logique...
drdd
Messages postés7Date d'inscriptionvendredi 15 octobre 2004StatutMembreDernière intervention 5 septembre 2005 30 août 2005 à 18:02
J'ai oublié de préciser : le fichier .COB n'est PAS un fichier test COBOL (ce serait alors du .cbl) ; il s'agit du fichier de configuration (texte - facile à éditer en cas de problème) qu'il ne faut par ailleur pas oublier de référencer dans le code source avant de compiler (2 options par défaut sont proposée, une pour Microsoft, une pour LINUX)
5 sept. 2005 à 20:36
Et en réponse à BugMaker : j'ai commencé la "programmation" avec les fichiers BATCH (les .BAT) sous DOS... Donc, on peut dire que j'en ai utilisé des GOTO*s*, et en quantité! (Ben oui: sous la version 6.22, on ne savait même pas faire de boucle! Ah! si j'avais connu Linux plus tôt...). Alors je n'ai rien contre les GOTO*s*...
Mais je dois quand même admettre qu'il est plus facile de se perdre et du prouire du code "spaghetti" avec des GOTO*s* qu'avec autre chose... Et je dis ça par expérience! Donc, à mon avis en tout cas,
"GOTO : seulement en cas d'urgence!"
PS : juste au cas où mon humour serait ENCORE pire que ce que je ne le pensait, je voulais dire par là qu'il vaut mieux les éviter tant qu'à faire, mais pas au point de devenir maniaque. A mon avis.
5 sept. 2005 à 20:01
ca n'est pas parce qu'un code est truffé de GOTO qu'il n'est pas lisible. j'ai programmé pendant 15 ans en cobol et on ne m'a jamais dit que mon code n'était pas lisible. on peut aussi faire du code "spagetti" sans utiliser un seul GOTO.
1 sept. 2005 à 18:58
Et pour Cyberboy2054 : je crois que j'ai une piste quant au pourquoi de la proscription du Goto par mon professeur (est-ce bien français, tout ça ?) : je ne suis qu'en première année (enfin... 2e maintenant) et vu que le niveau de la classe n'est pas très élevé (bel euphémisme s'il en est) ça pourrait expliquer qu'il insiste pour avoir des programmes ne comprenant qu'une rentrée et une sortie : plus simple et donc moins de risque d'erreur. Et c'est vrai que nous n'avons pas encore eu de programme "nécessitant" un système avec plusieurs return*s* (ou ... Goto*s*).
1 sept. 2005 à 16:19
1 sept. 2005 à 15:16
Je l'ai pourtant croisé bon nombre de fois dans des sources que j'ai lues pour sortir prématuremment d'une fonction, et souvent cette solution apparaissait plus élégante que l'utilisation d'un goto ou autre...
31 août 2005 à 19:13
Oui, en effet, je savais que le Goto était à proscrire (la première chose qu'on nous apprend, c'est que le Goto est LA commande universelle par exellence, mais qu'il ne faut JAMAIS l'utiliser ^_^) ;
mais on m'avait aussi dit qu'il en était de même pour leS (attention au "S") return... Notre professeur insiste pour avoir UN point de départ et UN point d'arrivée... Et il était hors de question que je fasse 5 "IF-THEN-ELSE" imbriqués!
Enfin, je suis d'accord, la solution avec plusieurs return donne mieux...
Je m'en vais de ce pas modifer le code.
Merci du coup de main.
30 août 2005 à 23:20
Tu utilise à plusieurs reprise "goto erreur". On a sans doute déja du te dire qu'en C c'est une instruction à éviter d'utiliser, car dans la plupart des cas, elle provient d'une erreur de conception de la fonction qui la contient. Ici, tu t'en sers pour afficher un message d'erreur, puis sortir de la fonction car on se retrouve à la fin.
Pourquoi ne pas plutot remplacer
if (!(argc>1)) { err_num=1; goto erreur;}
par
if (!(argc>1))
{
printf("\nEt si vous précisiez un fichier, pour voir ?\n");
return 0;
}
Je trouve cela plus logique: "return" indique de manière explicite que l'on sort de la fonction, alors qu'avec goto il faut se balader dans le fichier pour retrouver la logique que tu as voulu imposer ...
Au passage, un truc que je n'ai pas compris, tu mets un code d'erreur (5, a la fin de la source), qui n'est pas present dans le switch de traitement des erreurs ... une erreur que tu aurais pu éviter avec ma méthode :p
Un dernier problème de logique:
!(argc > 1) == (argc <= 1) :p
On dit plus couramment "est inférieur ou égal à 1" que "n'est pas superieur à 1". Evidemment c'est pas grave mais c'est pas logique...
30 août 2005 à 18:02