Bug avec Procedure + select > > >> Bug grave

Archive.
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Bug avec Procedure + select > > >> Bug grave

Message 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...
gnozal
Messages : 832
Inscription : mar. 07/déc./2004 17:35
Localisation : France
Contact :

Message 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)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

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

Message 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)
Anonyme

Message 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 :?
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
Avatar de l’utilisateur
Jacobus
Messages : 1520
Inscription : mar. 06/avr./2004 10:35
Contact :

Message 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.
Quand tous les glands seront tombés, les feuilles dispersées, la vigueur retombée... Dans la morne solitude, ancré au coeur de ses racines, c'est de sa force maturité qu'il renaîtra en pleine magnificence...Jacobus.
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 !! :)
Mytic
Messages : 466
Inscription : mer. 25/juil./2007 0:13

Message 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 !! :?
lionel_om
Messages : 1500
Inscription : jeu. 25/mars/2004 11:23
Localisation : Sophia Antipolis (Nice)
Contact :

Message 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
Webmestre de Basic-univers
Participez à son extension: ajouter vos programmes et partagez vos codes !
Répondre