Page 1 sur 1

drole de bug ou drole de code ?

Publié : lun. 07/oct./2024 20:17
par case
le code suivant plante, la valeur de 'nb' deviens enorme a partir du moment ou la condition dans le select/case est vraie et qu'on utilise le got dans la meme procedure. est-ce un bug ? est-ce normal ? pourquoi tant de haine ^^

Code : Tout sélectionner

Procedure.i rolldice(nb.i,type.i,option=0)  
  rollz:
  retry=0
  Debug "rollz"
  result=0
  Debug "nb"+nb
  For rol=1 To nb
    result+Random(type,1)  
  Next 
  Debug result
  Select option
    Case 1
      If result<10        
        Debug "result < 10 "
        Goto rollz
      EndIf
  EndSelect
  
  ProcedureReturn result
EndProcedure

For a= 1 To 10
  rolldice(3,6,1)
Next

Re: drole de bug ou drole de code ?

Publié : mar. 08/oct./2024 0:11
par cage
Bonsoir,
Il ne faut pas sortir salement d'un Select / EndSelect
Sortir normalement du Select en positionnant une variable qui indique la condition de sortie.
cage

Code : Tout sélectionner

Procedure.i rolldice(nb.i,type.i,option=0)  
  rollz:
  retry=0
  Debug "rollz"
  result=0
  Debug "nb"+nb
  For rol=1 To nb
    result+Random(type,1)  
  Next 
  Debug result
  case1=#False
  Select option
    Case 1
      case1=#True
  EndSelect
  If case1 And result<10
    Debug "result < 10 "
    Goto rollz
  EndIf
  ProcedureReturn result
EndProcedure

For a= 1 To 10
  rolldice(3,6,1)
Next

Re: drole de bug ou drole de code ?

Publié : mar. 08/oct./2024 7:28
par case
oui c'est ce que j'ai fait, je me demandais juste si cela etait normal.
je ne comprenais pas ce 'bug' qui modifiait une variable.

il n'est pas indiqué dans la doc que sortir d'un select/case par un goto par exemple peux creer des bugs.

Re: drole de bug ou drole de code ?

Publié : mar. 08/oct./2024 10:55
par Itsy Bitsy
Bonjour,

Ce n'est qu'un problème de pile.

Code : Tout sélectionner

 Syntax
Goto <label> 
Description
Cette commande permet de transférer directement l'exécution du programme à l'emplacement d'un label. Soyez attentif en utilisant Goto car une mauvaise utilisation peut provoquer une fin anormale du programme... 

Note: Pour sortir d'une boucle en toute sécurité, vous devez toujours utiliser Break à la place de Goto et ne l'utilisez pas dans un bloc Select/EndSelect, à moins que vous ayez les aptitudes nécessaire pour gérer la pile vous-même. 
Avec un !POP RAX sur X64 cela fonctionne.

Code : Tout sélectionner

Procedure.i rolldice(nb.i,type.i,option=0)  
  rollz:
  retry=0
  Debug "rollz"
  result=0
  Debug "nb"+nb
  For rol=1 To nb
    result+Random(type,1)  
  Next 
  Debug result
  Select option
    Case 1
      If result<10        
        Debug "result < 10 "
        !POP RAX                 ; PEUT ETRE !POP EAX SUR x86 ???
        Goto rollz
      EndIf
  EndSelect
  
  ProcedureReturn result
EndProcedure

For a= 1 To 10
  rolldice(3,6,1)
Next
Il me semble que FakeReturn fonctionnait avant, mais plus maintenant.

Peut-être faudrait il fabriquer une macro, en attendant une instruction intégrée ?