Page 1 sur 2

Aide TailBite

Publié : sam. 15/oct./2005 9:59
par lionel_om
Bonjours à tous.
J'ai une question sur TailBite, d'autres viendront surment par la suite.

Avec TailBite, on peut créer des fonctions myFct_DEBUG() (qui doit être du type CDLL).
Mais a-t-on besoin de créer une la fonction myFct() ???

Dans l'exemple de la doc :

Code : Tout sélectionner

   ProcedureDLL MyDiv(a, b)
     ProcedureReturn a/b
   EndProcedure

   ProcedureCDLL MyDiv_DEBUG(a, b)
    If b=0
      TB_DebugError("Division by zero!")
    EndIf
   EndProcedure
On peut pas garder que la première fonction ?

Ou sinon c'est que la fonction myDiv8debug est exécutée si le debuggeur est activé, sinon on exécute l'autre (cad myDiv()) ???

Je sais pas si je suis assez clair...
Merci d'avance pour votre aide !!! :P

Re: Aide TailBite

Publié : sam. 15/oct./2005 10:08
par Chris
lionel_om a écrit :Je sais pas si je suis assez clair...
Ben pas trop, non!!!


Ta procédure principale, c'est celle la:

Code : Tout sélectionner

ProcedureDLL MyDiv(a, b) 
   ProcedureReturn a/b 
EndProcedure 
c'est sur elle que tu travailles

l'autre, c'est celle qui t'affichera un message au cas ou tu mettrais 0 comme paramètre 'b' de la première, ce qui ferait une division par 0

Mais tu peux ne mettre que la première si tu veux, tu n'auras simplement pas de débugage en cas de plantage. (avec le debugger activé, evidemment)

(Et c'est ProcedureCDLL pour la procedure de debuggage)

Publié : sam. 15/oct./2005 10:14
par nico
Je n'ai jamais utilisé cette faculté mais telle que tu l'as présente, on dirait plutôt une fonctionnalité d'informations sur des paramètres afin de s'assurer du bon fonctionnement de la procédure; ce n'est pas réellement du déboguage, non?

Publié : sam. 15/oct./2005 10:23
par Chris
La procédure, tu peux lui faire dire ce que tu veux!

Tu peux, (je pense, j'ai jamais essayé!), mettre plusieurs TB_DebugError("Ton_Message") selon les différents tests que tu fais à l'intérieur. Ca revient à avoir les fonctions de débuggage qu'on avait avant, dans les versions précédentes de PureBasic

Publié : sam. 15/oct./2005 10:32
par lionel_om
En fait, j'ai pas du être assez clair en effet.
Donc je vais procédé par étapes et petites questions :

1 ) Qd on créer des fonction myFct() et myFct_DEBUG() laquelle est lancée et à quel moment ? Est-ce que myFct() sera exécutée ou y'aura juste la fct DEBUG qui sera lancée ?

2 ) Plutot que de faire copier/coller pour les deux fcts précédentes (avec quelques lignes de debuggage de plus pour myFct_DEBUG) est-ce qu'on ne peut pas juste utiliser myFct_DEBUG et supprimer l'autre ? myFct() ne devient-elle pas inutile ?

3 ) Est-ce que myFct_Debug() est exécutée qd on est on mode programmation (que la fct n'est pas dans un EXE) et myFct() est exécutée quand on aura généré un EXE ?

Je suis plus clair là ?

Lionel

Publié : sam. 15/oct./2005 10:46
par Chris
lionel_om a écrit :En fait, j'ai pas du être assez clair en effet.
Donc je vais procédé par étapes et petites questions :

1 ) Qd on créer des fonction myFct() et myFct_DEBUG() laquelle est lancée et à quel moment ? Est-ce que myFct() sera exécutée ou y'aura juste la fct DEBUG qui sera lancée ?

2 ) Plutot que de faire copier/coller pour les deux fcts précédentes (avec quelques lignes de debuggage de plus pour myFct_DEBUG) est-ce qu'on ne peut pas juste utiliser myFct_DEBUG et supprimer l'autre ? myFct() ne devient-elle pas inutile ?

3 ) Est-ce que myFct_Debug() est exécutée qd on est on mode programmation (que la fct n'est pas dans un EXE) et myFct() est exécutée quand on aura généré un EXE ?

Je suis plus clair là ?

Lionel
myFct(), c'est ta fonction principale. C'est elle qui contient ton code, et c'est elle que tu doit appeler. L'autre, c'est Pure qui l'appelle quand il est en mode débugger et que la fonction principale comporte une erreur, tu n'as pas à t'en occuper. Si elle existe, elle est appelée, si elle n'existe pas, .....

myFct(), est la fonction obligatoire, c'est elle qui fait tourner ta lib. L'autre est facultative, c'est juste une fonction de débuggage qui, normalement, ne sert plus une fois l'exe compilé.

Publié : sam. 15/oct./2005 11:00
par Dr. Dri
nico a écrit :Je n'ai jamais utilisé cette faculté mais telle que tu l'as présente, on dirait plutôt une fonctionnalité d'informations sur des paramètres afin de s'assurer du bon fonctionnement de la procédure; ce n'est pas réellement du déboguage, non?
Justement, si tu fais une commande de dessin tu peux renvoyer le même message d'erreur que PB quand on dessine hors d'un startdrawing() stopdrawing() valide
Je savais pas comment le faire donc je vais regarder le code généré assembleur par tailbite pour les fonctions de débugage :)

Dri

Publié : sam. 15/oct./2005 11:02
par Chris
Petite rectification:

j'ai dit
L'autre, c'est Pure qui l'appelle quand il est en mode débugger et que la fonction principale comporte une erreur
Il l'appelle toujours, même si il n'y a pas d'erreur! :roll:

Compile ça en librairie

Code : Tout sélectionner

ProcedureDLL MyDiv(a, b)
  ProcedureReturn a/b
EndProcedure

ProcedureCDLL MyDiv_DEBUG(a, b)
  If b = 0
    TB_DebugError("Division by zero!")
  EndIf
  
  If b > a
    TB_DebugError("B est plus grand que A")
  EndIf
  
  If b < a
    TB_DebugError("B est plus petit que A")
  EndIf
EndProcedure
et appelle la fonction

Code : Tout sélectionner

Debug MyDiv(10,0)
et change les valeurs pour que A soit plus petit ou plus grand que B

Publié : sam. 15/oct./2005 11:08
par nico
Le fait de faire une procédure à part, ça limite quand même, car on ne peut pas intervenir en milieu de procédure; c'est avant ou rien!

Publié : sam. 15/oct./2005 11:14
par lionel_om
En fait, si la procédure DEBUG existe elle est d'abord appelée, puis après c'est au tour de la fonction NORMAL qui est appelée La preuve :

Code : Tout sélectionner

ProcedureDLL myMult(*par1.l, par2.l)
  If PeekL(*par1) = 0 Or par2 = 0
    ProcedureReturn -1
  EndIf
  ProcedureReturn PeekL(*par1) * par2
EndProcedure


ProcedureCDLL myMult_DEBUG(*par1.l, par2.l)
    PokeL(*par1, PeekL(*par1) * 5)
  If PeekL(*par1) = 0 Or par2 = 0
    TB_DebugError("One paramater is zero!")
    ProcedureReturn -2
  EndIf
  ProcedureReturn PeekL(*par1) * par2 * 2
EndProcedure



val.l = 5
MessageRequester("", Str(myMult(@val, 2)), 0)
  ; val a bien été multiplié par 5 : 5 * 5 * 2 = 50
  ; 50

MessageRequester("", Str(myMult(@val, 0)), 0)
  ; Erreur
Donc faut faire attention sinon on a deux fois le mm code d'exécuté ... :?

EDIT : donc les procédures DEBUG sont uniqument utiles pour contrôler les paramètres passés ?!!

Publié : sam. 15/oct./2005 11:15
par Chris
8O

Ou est le problème?
Qu'est-ce qui t'empèche de faire des tests dans la procédure principale? Rien!

La proc de debuggage permet seulement d'arreter le programme sur l'erreur, et de te faire voir ce qui ne vas pas.
Une fois l'exe compilé, qu'elle soit là ou pas ne change rien à l'affaire!

Publié : sam. 15/oct./2005 11:18
par lionel_om
donc les procédures DEBUG sont uniqument utiles pour contrôler les paramètres passés ?!!

Publié : sam. 15/oct./2005 11:26
par Chris
Tu as essayé en remplacant les MessageRequester() par des 'Debug'

Ton message "One paramater is zero!" ne s'affiche pas dans le debugger!

[Edit]

Je viens de regarder l'aide, effectivement, la procedure Debug est appelée avant. Cela dit, ça ne change rien

Publié : sam. 15/oct./2005 11:52
par nico
C'est quand même pas très fonctionnel, mais bon si on fait une lib c'est quelle est un minimum débogué et puis on a toujours le source. Donc c'est utile surtout pour ceux qui utilisent la lib.

Publié : sam. 15/oct./2005 12:02
par Dr. Dri
nico a écrit :mais bon si on fait une lib c'est quelle est un minimum débogué
Justement, les libs de PB sont (quasiment) exemptes de bugs mais ce genre de chose concerne surtout les utilisateurs... Essaye un code qui enchaine deux startdrawing() sans stopdrawing(). Les fonctoins ont beau ne pas contenir de bug le debugger te criera dessus parce que tu ne l'utilise pas correctement.
C'est surtout ca le but...

Dri