Le topic qui vaudra mon ban : GOTO dans Club | Pokémon Trash
Le topic qui vaudra mon ban : GOTO
Morsula - 25 mars 2012 à 23:38
Voilà, heureux de vous avoir connu :'(
Sérieux, qu'est-ce que vous avez, vous les universitaires, contre l'utilisation du GOTO ? Quand tu penses qu'un mec l'a inventé et qu'on nous interdirait de l'utiliser sous prétexte que c'est sale. Il y a un tabou qui ne me plaît guère sur ce sujet :°)
Nkekev - 25 mars 2012 à 23:44
C'est quoi goto ?
likam - 25 mars 2012 à 23:51
C'est quoi goto ?
Pareil :v
Morsula - 25 mars 2012 à 23:56
Ooooh :fail:
LLdex - 26 mars 2012 à 00:01
En gros, en général on n'aime pas trop ça parce que ça « casse » le flux d'exécution du programme.
Par exemple, si tu mets un label (le truc qui sert d'étiquette pour le GOTO) dans un bloc de portée différente du GOTO qui renvoie vers lui, le programme aura un comportement indéterminé.
Petit exemple en pseudo-code de ce qu'il ne faut SURTOUT JAMAIS faire :
if (foo == bar) label :foobar print "foo vaut bar"else goto :foobarend if
Ici, le programme va retourner dans la première partie du if même si la condition est fausse, et il risque, selon l'implémentation du langage, de réexécuter le else indéfiniment.
Ou encore :
i = 0while (i < 10) do label :foobar print "i est inférieur à 10" i = i + 1donegoto :foobar
Là, l'intérieur de la boucle est exécuté alors que i vaut 10 à sa sortie, donc la condition n'est plus censée être vérifiée.
Encore pire :
for (i = 0, i < 10, i = i + 1) do label :foobar print "i est inférieur à 10"donegoto :foobar
i n'a de portée que dans le for ; il est initialisé quand la boucle commence et il est « détruit » à sa sortie.
Or, on demande au programme d'y retourner, mais ça ne peut pas fonctionner puisque le for a besoin de i pour savoir où il en est.
Le flux d'exécution est complètement brisé ici.
Si tu veux vraiment utiliser le GOTO, je te conseille le GOTO++, un langage français très sérieux au rayonnement international (le mieux c'est de commencer par lire le manuel).
Wiktooore - 26 mars 2012 à 16:49
J'ai pas lu le post de LL.
Mais je crois que goto c'est une commande en programmation objet qui permet de faire aller quelque chose quelque part.
LLdex - 26 mars 2012 à 17:14
:captainobvious.jpg:
C'est plutôt utilisé en non-objet en fait, par exemple en Batch (commandes DOS) où c'est le seul moyen de faire des boucles.
Efferalgan - 26 mars 2012 à 18:00
LLdex : "Si vous utilisez une commande n'importe comment, ça fait n'importe quoi, attention."
Je programme pour ma part très peu (Maple et Basic Casio), et je suis plutôt tourné vers la politique du "on fait avec ce qu'on a". Un programme sur calculette ne sera jamais hyper long, et donc il est généralement assez facile de voir où les Goto mènent, et il serait stupide de s'en priver, parce que t'as pas beaucoup d'autres commandes, et que de toute façon, ton code sera pas lisible (non, la calculette ne gère pas les tabulations).
M2K - 26 mars 2012 à 18:02
"Si vous utilisez une commande n'importe comment, ça fait n'importe quoi, attention."
lapalissade
Efferalgan - 26 mars 2012 à 18:04
Merci, M2K, pour cette remarque constructive.
M2K - 26 mars 2012 à 18:06
Si t'as un cerveau tu comprendras que j'ai dit "lapalissade" comme j'aurai pu dire "Oh, et en quoi cela diffère t-il des autres langages".
Efferalgan - 26 mars 2012 à 18:10
Ça n'en diffère pas.
LLdex - 26 mars 2012 à 18:11
LLdex : "Si vous utilisez une commande n'importe comment, ça fait n'importe quoi, attention."
Je programme pour ma part très peu (Maple et Basic Casio), et je suis plutôt tourné vers la politique du "on fait avec ce qu'on a". Un programme sur calculette ne sera jamais hyper long, et donc il est généralement assez facile de voir où les Goto mènent, et il serait stupide de s'en priver, parce que t'as pas beaucoup d'autres commandes, et que de toute façon, ton code sera pas lisible (non, la calculette ne gère pas les tabulations).
C'est justement ce que j'ai dit en parlant du Batch, il y a des langages où tu ne peux pas faire autrement (j'ai fait du TI-Basic et c'est une instruction plus ou moins incontournable).
Mais dans la plupart des langages « évolués », il vaut mieux ne pas s'en servir, car la continuité du flux d'exécution est souvent très importante (surtout en multithread par exemple).
Avec les fonctions et les boucles, normalement tu dois pouvoir te passer de GOTO.
Efferalgan - 26 mars 2012 à 18:14
On est d'accord.
EVILANGEL - 26 mars 2012 à 20:16
Voilà, heureux de vous avoir connu :'(
Sérieux, qu'est-ce que vous avez, vous les universitaires, contre l'utilisation du GOTO ? Quand tu penses qu'un mec l'a inventé et qu'on nous interdirait de l'utiliser sous prétexte que c'est sale. Il y a un tabou qui ne me plaît guère sur ce sujet :°)
Sérieux, qu'est-ce que vous avez, vous les bidouilleurs, pour l'utilisation du GOTO ?
Quand tu penses qu'un mec a inventé les structures de contrôles (if, while, toussa) et qu'un autre a inventé les fonctions; et qu'on nous dirait de faire des GOTO à la place sous prétexte qu'on peut. Il y a un tabou qui ne me plaît guère sur ce sujet :°)
Plus sérieusement, un goto, c'était bien il y a 40 ans. Maintenant, il y a mieux: aussi performant (si ton compilo/interpreteur est pas en bois), plus maintenable, plus lisible, plus réutilisable, plus structuré, plus évolutif, plus propre.
Il n'y a aucun taboo: c'est juste qu'il y a largement mieux pour toutes les situations. Du coup, un type qui te sort un goto, c'est un type qui ne sait pas programmer.
Donne moi UN exemple où le GOTO a un intérêt. Sérieusement. Non mais sérieusement. Soit ça permet de gérer des conditions, mais c'est moins bien que des if while for et compagnie, soit ça permet de la factorisation de code, mais c'est moins bien que les fonctions.
Tu vois le problème sous un mauvais angle: ce n'est pas parce que ça a été inventé que c'est bien. Ca a été inventé, puis remplacé parceque ce n'était PAS bien. Il n'y a AUCUN intérêt à utiliser des goto, aucun, c'est travailler avec des outils du passé, qui ont été remplacés pour tout un tas de raisons par d'autres instructions. Et il y a plus d'universitaires qui vont te parler de goto avec toutes leurs merdes théoriques que de pro. Parle à ton patron de goto; s'il a eu une formation en info... GOTO la_porte.
PS: l'intérêt du goto c'est en langage machine, car le reste existe pas, et quand tu compiles, tes fonctions, if et autres sont transformés en goto par le compilateur.
PPS: ça a aussi de l'intérêt dans les langages où il y a pas de fonctions et de if etc. Ahem.
PPPS: dans une autre mesure, faire un switch pour tester le type d'un objet est tout aussi sale en POO. Je troll même pas, le switch est le goto de la POO (qu'est-ce qu'on a pu me casser le crâne avec ça)
Donc t'aimes les goto? C'est cool, mais oublie, car sinon un jour, tôt ou tard, tu vas en chier, méchamment, alors que ça aurait été plus simple de s'en passer. Prend vite le bon plie, sinon tu le regretteras plus tard.
Morsula - 26 mars 2012 à 20:51
Je sais que c'est sale de programmer avec GOTO mais j'ai quand même réussi à en placer quatre dans mon programme en PureBasic (sur les 6 prévus), plus par flemme de faire un If ... ElseIf ... EndIf que par réelle conviction pour l'archaïsme.
EVILANGEL - 26 mars 2012 à 20:55
Mais c'est pas plus chiant de foutre des goto!? C'est un putain de brain fuck des fois en plus, alors que les if ça se remplit de manière quasi-automatique.
Morsula - 26 mars 2012 à 22:15
Bof, non, du moins pas dans mon cas pour le petit programme en mode console de conversion décimal/hexadécimal/binaire que je fais. J'ai une structure simple donc foutre quelques GOTO c'est pas ce qui va rendre mon programme incompréhensible et plus lent.
Après ouais, ça serait plus propre de le faire avec des Si imbriqués :°)
Nkekev - 26 mars 2012 à 23:05
Non mais goto poubelle.
Ça n'aurait jamais du exister.
EVILANGEL - 26 mars 2012 à 23:20
Bof, non, du moins pas dans mon cas pour le petit programme en mode console de conversion décimal/hexadécimal/binaire que je fais. J'ai une structure simple donc foutre quelques GOTO c'est pas ce qui va rendre mon programme incompréhensible et plus lent.
Après ouais, ça serait plus propre de le faire avec des Si imbriqués :°)
Des si imbriqués? Ca existe?[/troll]
c/c moi ton code petit joueur.
Aura Azure - 27 mars 2012 à 16:41
Dans certains langages et/ou sur certains interpréteurs, le goto est obligatoire, de par l'inexistance des fonctions et des boucles if/for/while/switch. Je pense au code ISO qu'utilisent les machines à commande numérique (pour l'usinage de matériaux etc) ou c'est du procédural pur (si tu sautes une étape, ta pièce est foutue, ou ton outil, ou la machine, ou même les trois). Le goto permet de faire une boucle toute simple.
Morsula - 27 mars 2012 à 20:38
Edualc va mourir d'une crise cardiaque :baffan:
LLdex - 27 mars 2012 à 22:03
C'est quoi ce langage ? PureBasic ?
Je connais pas vraiment ce genre de trucs, mais il doit bien y avoir possibilité de définir des fonctions, non ?
Utiliser des GOTO et des labels pour exécuter des routines, ça se fait en assembleur, mais si tu peux utiliser des fonctions, c'est ce qu'il faut privilégier.
En plus, t'as merdé sur ton indentation (lignes 28 à 31). :huhu:
Et tu dois pouvoir utiliser un Select…Case au lieu de tous tes If imbriqués, en transformant Choix$, qui semble être une chaîne, en entier avec Val(Choix$) au prélable (Select…Case ne semble accepter que des entiers).
Aura Azure - 27 mars 2012 à 23:17
Y'a aussi les scripts dans les jeux Pokémon qui fonctionnent beaucoup à base de goto, bien que ces goto soient plutôt des appels à des sous-programmes qu'autre chose.
EVILANGEL - 27 mars 2012 à 23:37
Edualc va mourir d'une crise cardiaque :baffan:
Beh oui, beh voilà, bah je ne vois pas l'intérêt, sauf si tu ne peux faire que des goto dans ton langage que je ne connais pas... (et à en croire tes messages sur FB, il me semble que ce n'est pas le cas.)
Que dire?
Un switch case dans un do while qui appelle des fonctions.
Plouf.
Aura Azure - 27 mars 2012 à 23:47
If Choix$ = "1"
//inserer ici le code complet de DecBin
ElseIf Choix$ = "2"
//inserer ici le code complet de BinDec
Etc.
EVILANGEL - 27 mars 2012 à 23:54
En sortant de DecBin et co. faut aussi retomber au bon endroit, et dès que ton programme sera un peu plus grand, ça ne sera plus jouable. Plus du tout.
LLdex - 27 mars 2012 à 23:54
Y'a aussi les scripts dans les jeux Pokémon qui fonctionnent beaucoup à base de goto, bien que ces goto soient plutôt des appels à des sous-programmes qu'autre chose.
Les scripts dans Pokémon, c'est pas une simple représentation du code binaire qui est derrière ?
Comme de l'assembleur, qui se traduit quasiment directement en code machine sans vraie compilation.
Ça explique les GOTO, qui ne seraient que des instructions de branchement (JMP, JE, JNE, etc) vers des routines.
Enfin, je ne connais pas vraiment les scripts dans Pokémon, je laisse ça aux pros de la section Rom-Hacking.
Aura Azure - 28 mars 2012 à 00:21
C'est en effet un langage bas niveau, mais tout de même très compréhensible.
LLdex - 28 mars 2012 à 00:26
J'ai pas dit le contraire.
D'ailleurs, après vérification sur le tuto de Sainior, ça ressemble en effet beaucoup à de l'ASM.