[Résolu] Pourquoi Select n'aime pas Return?

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Crashdisk
Messages : 15
Inscription : sam. 18/févr./2012 17:09

[Résolu] Pourquoi Select n'aime pas Return?

Message 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
Dernière modification par Crashdisk le dim. 19/févr./2012 15:14, modifié 1 fois.
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pourquoi Select n'aime pas Return?

Message par G-Rom »

Bonjour et bienvenu(e)

Break
lepiaf31
Messages : 510
Inscription : dim. 25/mars/2007 13:44
Localisation : Toulouse, France
Contact :

Re: Pourquoi Select n'aime pas Return?

Message 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
Crashdisk
Messages : 15
Inscription : sam. 18/févr./2012 17:09

Re: Pourquoi Select n'aime pas Return?

Message 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....?
G-Rom
Messages : 3641
Inscription : dim. 10/janv./2010 5:29

Re: Pourquoi Select n'aime pas Return?

Message 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:
dayvid
Messages : 1242
Inscription : mer. 11/nov./2009 18:17
Localisation : Poitiers (Vienne)

Re: Pourquoi Select n'aime pas Return?

Message 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 :)
La vie, C'est comme, Une boitte, De startis, On en voie, De toutes, Les couleurs !

Mon forum http://purebasic.forumphp3.com/index.php
Le Soldat Inconnu
Messages : 4312
Inscription : mer. 28/janv./2004 20:58
Localisation : Clermont ferrand OU Olsztyn
Contact :

Re: Pourquoi Select n'aime pas Return?

Message par Le Soldat Inconnu »

personnellement, je dis que c'est plus propre, les Gotos, c'est à bannir :) ou alors à utiliser avec une énorme parcimonie
Je ne suis pas à moitié Polonais mais ma moitié est polonaise ... Vous avez suivi ?

[Intel quad core Q9400 2.66mhz, ATI 4870, 4Go Ram, XP (x86) / 7 (x64)]
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pourquoi Select n'aime pas Return?

Message 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 !! :)
zaphod
Messages : 135
Inscription : dim. 07/déc./2008 9:32

Re: Pourquoi Select n'aime pas Return?

Message 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"
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pourquoi Select n'aime pas Return?

Message 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 :)
Crashdisk
Messages : 15
Inscription : sam. 18/févr./2012 17:09

Re: Pourquoi Select n'aime pas Return?

Message 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...
Dernière modification par Crashdisk le dim. 19/févr./2012 11:29, modifié 1 fois.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pourquoi Select n'aime pas Return?

Message 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
Crashdisk
Messages : 15
Inscription : sam. 18/févr./2012 17:09

Re: Pourquoi Select n'aime pas Return?

Message par Crashdisk »

Crashdisk a écrit :Pas cool pour un langage qui se veut portable...
non?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Re: Pourquoi Select n'aime pas Return?

Message 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
Crashdisk
Messages : 15
Inscription : sam. 18/févr./2012 17:09

Re: Pourquoi Select n'aime pas Return?

Message 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é.
Dernière modification par Crashdisk le dim. 19/févr./2012 11:51, modifié 1 fois.
Répondre