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++... :oops:

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

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


[reedit]

confirmé !!

lors d'un select
on fait en fait

Code : Tout sélectionner

  PUSH   qword [v_valeur]
; on empile

et au endselect

Code : Tout sélectionner

 POP    rax
; 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 !! 8O

ça marche parce que FakeReturn dépile !! :)

Code : Tout sélectionner

; Select valeur
  PUSH   qword [v_valeur]

Code : Tout sélectionner

; FakeReturn ;************
  POP    rax
et du coup remplace le "EndSelect"

Code : Tout sélectionner

; EndSelect
_EndSelect1:
  POP    rax
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 :D

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 ! :roll:

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

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 :twisted: 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é.