Page 1 sur 1

Bug avec Procedure + select > > >> Bug grave

Publié : mer. 27/août/2008 1:38
par Mytic
Bonjour !
J’ai déjà signalé la présence de ce bug dans un post.
Mais là j’ai trouvé la source !!!
Ce bug n’existe que dans la version 4.2 !

Regardez par vos propres yeux et vos propres compilo -_-

Code : Tout sélectionner

Procedure A(C.b)



Select C

   Case 1
     Goto fin:
   
   Case 2
   
   
EndSelect



fin:
EndProcedure


A(1)
A(1) = Bug [Invalide memory access. ( write error at address 0 )]
A(2) = pas de bug
:x :?
:!:

( J’ai utilisé le mot grave pour attirer l’attention des créateurs de ce langage)
merci pour votre attention...

Publié : mer. 27/août/2008 7:57
par gnozal
C'est plutôt "GOTO >>>> Bug grave" ...

Par ailleurs, ce n'est pas très 'propre' d'utiliser un GOTO pour sortir d'un SELECT/CASE. Pourquoi utiliser GOTO en Purebasic 8O ?

Si tu veux absolument quitter la procédure à l'intérieur d'un SELECT/CASE (pourquoi ?), on peut s'en sortir autrement :

Code : Tout sélectionner

Procedure A(C.b) 
  Select C 
    Case 1 
      ProcedureReturn
    Case 2 
  EndSelect 
EndProcedure

A(1)

Publié : mer. 27/août/2008 10:51
par Mytic
J’ai donné un exemple banal pour montrer d’où venait le problème tout simplement.

Mais il y’a des cas où Goto est préférable à plusieurs IF.
Exemple :

Code : Tout sélectionner


Procedure A(C.b)



Select C

   Case 1
     B = 0
   
   Case 2
      B = 1
   Default
      B = 1
   
EndSelect

If B
   Debug " je ne veux pas voir ce text !!"
EndIf

fin:
Debug "mais je veux voir ça"

EndProcedure


A(1) 
Et ça aussi ce n’est qu’un exemple simplifier.

Je sais que les Goto sont déconseillés ! Mais pourquoi ? Alors qu’avec ces Goto on peut optimiser le Code en vitesse.

Publié : mer. 27/août/2008 17:36
par Backup
ben oui mais il fait un saut en restant DAns la procedure !!

selon moi , ça devrai pas planter !!

c'est pas joli comme code, soit, mais cela devrai marcher !! :)

(le premier listing posté ici)

Publié : mer. 27/août/2008 17:46
par Anonyme
Si je me souviens bien de ce que l'on m'avais dit (Djes?) c'est un problème de pile... un problème logique aprioris , donc pas un bug , mais je ne saurais l'expliquer clairement :?

Publié : mer. 27/août/2008 17:57
par Anonyme2
Fred s'est déjà expliqué la-dessus mais je partage l'avis de Dobro, ça ne devrait pas planter et je partage aussi l'avis de GNOZAL, Goto à proscrire

Le problème vient de la manière dont Fred a codé le select

Lorsque l'instruction est rencontrée, la valeur qui suit le select est empilée (mis sur la pile du microprocesseur), le registre esp s'en trouve modifié. Lorsque l'instruction Endselect est rencontrée, on dépile et le registre esp retrouve sa valeur, mais si on se barre avec un goto, la, il ne rencontre pas l'instruction Endselect et il y a une erreur de pile.

C'est un problème peut pas si facile à régler avec l'utilisation de la pile surtout avec des imbrications.

Je propose que l'on supprime les Goto :D

Et hop, un problème réglé une fois pour toute :D


Dobro, moi aussi j'ai fait du basic il y a quelque année (en 1981 , j'étais à Besançon) et les goto il n'y avait que ça mais il existait aussi la programmation structurée pour éviter les pièges des goto qui deviennent vite ingérables.


A+
Denis

Publié : mer. 27/août/2008 18:48
par Jacobus
@Mytic: Ca rejoint le bug que tu avais signalé avec les Threads et GoTo
J'ai d'ailleurs viré, à chaque fois que possible, les GoTo que j'utilisais dans mes procédures.

Publié : mer. 27/août/2008 21:37
par Backup
Denis a écrit : Dobro, moi aussi j'ai fait du basic il y a quelque année (en 1981 , j'étais à Besançon) et les goto il n'y avait que ça mais il existait aussi la programmation structurée pour éviter les pièges des goto qui deviennent vite ingérables.


A+
Denis
heu ! j'avais encore rien dit moi :lol:

toutefois j'aime les goto quelque fois il me sont indispensable ;)

alors plutot que les supprimer, je propose plutôt que Fred mette dans la doc a "Goto" , que son emploi est déconseillé dans le cadre des procédures
et en general dans le cadre des fonctions qui sont "encadrée"

select-enselect, procedure-endprocedure, startDrawind etc .... :D

comme ça si quelqu'un utilise un goto a tord et a travers, ben, il est prévenu !! :)

Publié : jeu. 28/août/2008 16:44
par Mytic
Au moins comme ça plusieurs bugs peuvent être évités.
Merci pour vos remarques et commentaires.
Je vais bientôt poster un nouveau BUG concernant les prototypes !! :?

Publié : sam. 30/août/2008 9:37
par lionel_om
Denis a écrit :Je propose que l'on supprime les Goto :D
Moi je suis d'accord. Du moins spécifier dans le doc de ne pas les utiliser: c'est bien pour les débutants, mais après qq mois de prog on ne doit plus les utiliser. Moi ça fait plus de 5 ans que je n'ai pas tapé ce mot...

Mais je valide l'avis de DoBro et de Denis: ça ne devrait pas planter. Mais vu la proportion de ceux qui l'utilise (et y'a toujours moyen de faire plus propre (Macro ou fonction), ce n'ai vraiment pas qq chose d'urgent à changer.

/Lio