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 ?