drole de bug ou drole de code ?

Sujets variés concernant le développement en PureBasic
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

drole de bug ou drole de code ?

Message 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
ImageImage
Avatar de l’utilisateur
cage
Messages : 604
Inscription : ven. 16/oct./2015 18:22
Localisation : France
Contact :

Re: drole de bug ou drole de code ?

Message 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
■ Win10 Pro 64-bit (Intel Celeron CPU N2920 @ 1.86GHz, 4,0GB RAM, Intel HD Graphics) & PB 6.12 LTS
■ Vivre et laisser vivre.
■ PureBasic pour le fun
■ Gérard sur le forum Anglais
■ Mes sites: http://pbcage.free.fr - http://yh.toolbox.free.fr
Avatar de l’utilisateur
case
Messages : 1545
Inscription : lun. 10/sept./2007 11:13

Re: drole de bug ou drole de code ?

Message 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.
ImageImage
Avatar de l’utilisateur
Itsy Bitsy
Messages : 13
Inscription : lun. 24/juin/2019 12:19

Re: drole de bug ou drole de code ?

Message 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 ?
Répondre