Page 1 sur 2
[Résolu] Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 17:30
par Crashdisk
Bonjour,
je suis confronté à un problème lors que je suis entre la fonction "Select" et "EndSelect".
Lorsque je suis avec une valeur=1 pas de problème mais dès que je fais un "Return" avant le "EndSelect" avec valeur=2 ou 3 ça "plante"!
Si une solution est facile à trouver, j'aurai voulu comprendre pourquoi ça ne fonctionne pas tel quel. Une idée?
Y a t-il une méthode pour interrompre une sous-routine dans un "Select"/"EndSelect?
Code : Tout sélectionner
valeur=1
Debug "Début de la routine principale"
Gosub Test
Debug "Retour à la routine principale"
Quit=1
Goto Fin
Test:
Debug "Début de la sous-routine"
Select valeur
Case 1
Debug "Cas 1"
Case 2
Debug "Cas 2"
Return
Default
Debug "Cas 3"
Return
EndSelect
Debug "Suite de la sous-routine avant de quitter"
Return
Fin:
Debug "Fin du programme"
Merci de vos lumières
Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 17:51
par G-Rom
Bonjour et bienvenu(e)
Break
Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 17:54
par lepiaf31
Je pense que c'est le même problème qu'un goto dans un select, ca corrompt la pile.
Cf ici:
http://www.purebasic.fr/french/viewtopi ... ct#p118547
Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 18:01
par Crashdisk
G-Rom a écrit :Bonjour et bienvenu(e)
Break
Break?! Break arrêt une boucle et là dans mon exemple il n'y en a pas...
C'était votre réponse ou juste une façon de m'envoyer balader....?
Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 18:08
par G-Rom
pas du tout , break est une commande , je joue en meme temps avec un membre du forum en multi , d'ou ma réponse rapide ^^
edit:
je dit des conneries, on est pas en c++...

Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 18:41
par dayvid
Et G-Rom, arrête de boire tu veut
Bon bin comme il est dit par notre très cher fred:
Le goto ne doit jamais etre utilisé à l'interieur d'un 'Select/Case' pour en sortir, ou la pile va etre corrompue
Je te propose de lire le fameux lien et de proceder a une modiffication de ton programme, exemple:
Code : Tout sélectionner
Procedure Test(valeur)
Debug "Début de la sous-routine"
Select valeur
Case 1
Debug "Cas 1"
Case 2
Debug "Cas 2"
ProcedureReturn
Default
Debug "Cas 3"
ProcedureReturn
EndSelect
Debug "Suite de la sous-routine avant de quitter"
ProcedureReturn
EndProcedure
valeur = 2
Debug "Début de la routine principale"
ValeurDeRetour = Test(valeur)
Debug "Retour à la routine principale"
Debug "Fin du programme"
T'en dis quoi

Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 19:26
par Le Soldat Inconnu
personnellement, je dis que c'est plus propre, les Gotos, c'est à bannir

ou alors à utiliser avec une énorme parcimonie
Re: Pourquoi Select n'aime pas Return?
Publié : sam. 18/févr./2012 19:30
par Backup
le probleme est dans l'architecture meme du code

tu cherche a quitter un Select///endselect alors meme que cette fonctionalité est prévu pour ne tenir compte que d'un cas
et quitter de toute façon
en traçant tu vois qu'on passe par le Endselect !!
je suppose qu'on remet la pile en etat (bulle de regarder l'equivalent assembleur)
regarde ce code :
Code : Tout sélectionner
valeur=2
calldebugger
Debug "Début de la routine principale"
Gosub Test
Debug "Retour à la routine principale"
Quit=1
Debug "Fin du programme"
end
Test:
Debug "Début de la sous-routine"
Select valeur
Case 1
Debug "Cas 1"
Case 2
Debug "Cas 2"
Case 4
Debug "Cas 4"
Case 5
Debug "Cas 5"
Case 6
Debug "Cas 6"
Case 7
Debug "Cas 7"
Default
Debug "Cas 3"
EndSelect
Debug "Suite de la sous-routine avant de quitter"
Return
tu vois que d'un point de vue architecture, j'ai changé la position de la fin de code
et comme ça quoiqu'il arrive ça va marcher
meme si pour le coup n je ferai mon G-rom et te dirai ... c'est pas tres "propre" comme façon de coder
[reedit]
confirmé !!
lors d'un select
on fait en fait
; on empile
et au endselect
; on depile !!
si tu quitte au milieu , c'est le crash !!

Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 10:51
par zaphod
salut,
je sais pas si c'est propre niveau gestion mémoire mais ca plante pas...
Code : Tout sélectionner
valeur=3
Debug "Début de la routine principale"
Gosub Test
Debug "Retour à la routine principale"
Quit=1
Goto Fin
Test:
Debug "Début de la sous-routine"
Select valeur
Case 1
Debug "Cas 1"
Case 2
Debug "Cas 2"
FakeReturn ;************
Return
Default
Debug "Cas 3"
FakeReturn ;************
Return
EndSelect
Debug "Suite de la sous-routine avant de quitter"
Return
Fin:
Debug "Fin du programme"
Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 11:01
par Backup
j'avais oublié Fakereturn !!
ça marche parce que FakeReturn dépile !!
et du coup remplace le "EndSelect"
mais , je ne conseille pas trop son utilisation

Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 11:14
par Crashdisk
Merci à tous pour vos pistes et éléments de réponse.
J'avais déjà compris que le goto, c'était le mal et je n'en utilise pas, par ailleurs, un avertissement est présent dans l'aide.
Je trouve par contre dommage qu'il n'y est pas de note sur le fait que le couple Select/EndSelect ne devrait pas être interrompu car ça ne coule pas de source même si dans la version de dayvid, on peut tout de même le faire dans une procédure avec un ProcedureReturn. Ca ne rend pas ce langage très clair mais bon ...
Dans mon problème initial, j'analyse en plusieurs étapes l'entête d'un fichier pour en donner la description et lorsque je tombe sur une anomalie ou un format non géré, je souhaite interrompre le processus. J'étais parti dans l'idée de lancer (ou non) une sous-routine pour effectuer ces tests qui elle même lance des procédures pour décoder/interpréter ces valeurs. Comme solution temporaire à mon bug Select/Return/EndSelect je défini un flag lors de test éliminatoire que je vérifie avec un If/Endif après le Select/EndSelect. C'est pas très bô mais ça fonctionne.
Je vais réfléchir pour structurer mon programme autrement avant d'aller loin. Encore merci pour vos suggestions et investigations
Edit:
Un FakeReturn? ça description fait encore plus peur que le Goto lui même ^^
Question bonus:
C'est normal que pour parler d'un basic, je lis partout dans ce forum des référence à l'assembleur?
J'ai cherché des routines pour faire des conversions little/big endian et je n'ai pas "encore" trouvé d'exemple en "pur" basic

Pas cool pour un langage qui se veut portable...
Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 11:27
par Backup
Crashdisk a écrit :
Question bonus:
C'est normal que pour parler d'un basic, je lis partout dans ce forum des référence à l'assembleur?
Purebasic n'est pas un Basic interprété !
en fait c'est une surcouche de Fasm l'assembleur

lorsque tu compile un fichier Pb , celui-ci est d'abord converti en Ass Fasm !
avant d'etre compilé

tu fais de l'assembleur sans le savoir
c'est pourquoi tu peux facilement transformer ton listing Purebasic en Assembleur
en utilisant la Directive de compilation /commented " ou en utilisant mon editeur EPB
(qui est en phase de création encore) qui propose la convertion
ou ce code :
http://www.purebasic.fr/french/viewtopi ... =6&t=12597
Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 11:30
par Crashdisk
Crashdisk a écrit :Pas cool pour un langage qui se veut portable...
non?
Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 11:33
par Backup
J'ai cherché des routines pour faire des conversions little/big endian et je n'ai pas "encore" trouvé d'exemple en "pur" basic
Pas cool pour un langage qui se veut portable...
commence pas comme ça !
utilise la fonction recherche du forum , des codes de conversions indian existe ici !... et ailleurs (forum anglais)
c'est facile de critiquer le langage, si tu ne fais pas de recherche
ici par exemple :
http://www.purebasic.fr/french/viewtopi ... an#p107376
Re: Pourquoi Select n'aime pas Return?
Publié : dim. 19/févr./2012 11:47
par Crashdisk
J'ai cherché, certainement pas comme il faut, et suis tombé le plus souvent sur des solution ASM. Je ne critique pas le langage lui même, c'est juste que l'utilisation qu'en font les utilisateurs, certainement en quête de performance, amène à des solutions 100% Inteloutside

alors qu'à terme je souhaite rendre mon programme portable sur Amiga. Mais pas de problème dans le fond, comme je suis en phase d'apprentissage je découvre l'utilisation des fonctions au fil des besoins et je remplacerai certaines parties de code emprunté quand je maitriserai les fonctions avancé.