Page 1 sur 1
[Résolu] Erreur dans une Macro
Publié : lun. 13/janv./2014 13:48
par Micoute
Bonjour à tous
j'ai une erreur à la ligne 60 : Une variable ne peut pas être nommée comme un mot-clé : If
j'aurais aimé transformer la procedure EstCarre(Id) par une macro, il y a surement une solution, c'est pourquoi que je vous demande vos lumières et je vous en remercie par anticipation.
Code : Tout sélectionner
Structure ObjetRectangle
Id.i
Longueur.d
Largeur.d
Surface.d
EstCarre.b
LongueurDiagonale.d
EndStructure
Global.ObjetRectangle *Rectangle
Procedure CreerRectangle(Id, Largeur.d, Longueur.d)
*Rectangle = AllocateMemory(SizeOf(ObjetRectangle))
*Rectangle\Id = Id
*Rectangle\Largeur = Largeur
*Rectangle\Longueur = Longueur
*Rectangle\Surface = Largeur * Longueur
*Rectangle\LongueurDiagonale = Sqr(Longueur + Largeur)
EndProcedure
Macro Surface(id)
*rectangle\Surface
EndMacro
Macro Longueur(id)
*Rectangle\Longueur
EndMacro
Macro Largeur(Id)
*Rectangle\Largeur
EndMacro
Macro EstCarre(Id)
If Longueur(Id) = Largeur(Id)
"Oui"
Else
"Non"
EndIf
EndMacro
;Procedure.s EstCarre(Id)
; If *Rectangle\Longueur = *Rectangle\Largeur
; ProcedureReturn "Oui"
; Else
; ProcedureReturn "Non"
; EndIf
;EndProcedure
Macro LongueurDiagonale(Id)
*Rectangle\LongueurDiagonale
EndMacro
;***TEST***
CreerRectangle(1, 1, 1)
Debug "Surface: " + Surface(1)
Debug "Longueur: " + Longueur(1)
Debug "Largeur : " + Largeur(1)
Debug "Longueur diagonale; " + LongueurDiagonale(1)
Debug "Est carré " + EstCarre(1)
Debug ""
CreerRectangle(2, 4, 20)
Debug "Surface: " + Surface(2)
Debug "Longueur: " + Longueur(2)
Debug "Largeur : " + Largeur(2)
Debug "Longueur diagonale; " + LongueurDiagonale(2)
Debug "Est carré " + EstCarre(2)
Edit de Taznormand : changement du titre de "Résoulu" en "Résolu"
Re: Erreur dans une Macro
Publié : lun. 13/janv./2014 17:59
par MLD
Bonsoir Micoute
Il y a des des erreurs dans ton code (du moins je crois)
Id et id ce n'est pas identique
Si je puis me permettre, tu utilise trop de macros pour pas grand chose. C'est pratique, mais dans un grand programme bonjour le débugage.
Je préfère les procédures bien plus simple lors d'une reprise du programme aprés quelques temps ou pour la recherche de bugs.
Mais ce n'est que mon humble avis.

Re: Erreur dans une Macro
Publié : lun. 13/janv./2014 18:21
par Backup
a ce que je crois en comprendre
une Macro est un moyen de remplacer literalement par son contenu !
donc si je fais :
Code : Tout sélectionner
Macro MonNot
Not
EndMacro
a = 0
If MonNot a ; Ici la ligne sera remplacée par : 'If Not a'
Debug "Ok"
EndIf
au moment de l'execution la ligne "If MonNot a" sera remplacé par 'If Not a'
ce qui donnera au final :
donc si je prends ton exemple
Code : Tout sélectionner
Macro EstCarre(Id)
If Longueur(Id) = Largeur(Id)
"Oui"
Else
"Non"
EndIf
EndMacro
;....
;.....
Debug "Est carré " + EstCarre(1)
deviendrai en fait :
Code : Tout sélectionner
Macro EstCarre(Id)
If Longueur(Id) = Largeur(Id)
"Oui"
Else
"Non"
EndIf
EndMacro
;....
;.....
Debug "Est carré " + If Longueur(Id) = Largeur(Id) "Oui" Else "Non" EndIf
d'ou le probleme car le compilo te dit que tu cherches a utiliser la directive "IF" comme une variable ... ça le fait pas
en clair une Macro n'est pas une procedure (une fonction ) ... elle n'est pas capable (et c'est pas fait pour ..) de retourner un résultat de comparaison ..
d'ailleurs l'exemple de la Doc
Code : Tout sélectionner
Macro Assertion(Expression)
CompilerIf #PB_Compiler_Debugger ; active uniquement l'assertion lorsque le débogueur est actif
If Expression
Debug "Assertion (Ligne " + #PB_Compiler_Line + ") : " + Guillemet#Expression#Guillemet
EndIf
CompilerEndIf
EndMacro
Assertion(10 <> 10) ; N'affichera rien
Assertion(10 <> 15) ; Devrait afficher l'assertion
ne fonctionne pas !!
il aurai fallu que Fred ajoute un MACROIF ---MACROELSE-----MACROENDIF ...
pour que le compilo puisse savoir quoi faire de ta condition ....
Re: Erreur dans une Macro
Publié : lun. 13/janv./2014 19:30
par falsam
Je n'aime pas trop les macros.
J'ai fait deux tests.
Code : Tout sélectionner
Macro IsCarre(id)
(Rectangle(id)\Largeur = Rectangle(id)\Longueur)
EndMacro
Structure ObjetRectangle
Id.i
Longueur.d
Largeur.d
Surface.d
EstCarre.b
LongueurDiagonale.d
EndStructure
Global Dim Rectangle.objetRectangle(10)
Rectangle(0)\Id = 0
Rectangle(0)\Largeur = 2
Rectangle(0)\Longueur = 2
Rectangle(1)\Id = 0
Rectangle(1)\Largeur = 2
Rectangle(1)\Longueur = 3
If IsCarre(0)
Debug "Carré"
Else
Debug "Pas Carré"
EndIf
If IsCarre(1)
Debug "Carré"
Else
Debug "Pas Carré"
EndIf
"If" fonctionne dans une macro (D'ailleurs c'est dans la documentation)
Code : Tout sélectionner
Macro Test(Width, Height)
If Width=Height
Debug "Oui"
Else
Debug "Non"
EndIf
EndMacro
Test(10,10)
Test(10,12)
Reste à l'appliquer à ton code mais je pense qu'une bonne procédure est aussi bien

.
Re: Erreur dans une Macro
Publié : lun. 13/janv./2014 19:43
par falsam
Finalement j'aurais opté pour ce code dépouillé de presque toutes les macros. Mais est ce la finalité de ton code initial ? ......
Code : Tout sélectionner
Structure ObjetRectangle
Id.i
Longueur.d
Largeur.d
Surface.d
EstCarre.b
LongueurDiagonale.d
EndStructure
Global.ObjetRectangle *Rectangle
Macro Carre(Id)
If *Rectangle\Largeur = *Rectangle\Longueur
*Rectangle\EstCarre = #True
EndIf
EndMacro
Procedure CreerRectangle(Id, Largeur.d, Longueur.d)
*Rectangle = AllocateMemory(SizeOf(ObjetRectangle))
*Rectangle\Id = Id
*Rectangle\Largeur = Largeur
*Rectangle\Longueur = Longueur
*Rectangle\Surface = Largeur * Longueur
*Rectangle\LongueurDiagonale = Sqr(Longueur + Largeur)
Carre(Id)
EndProcedure
;***TEST***
CreerRectangle(1, 1, 1)
With *Rectangle
Debug "Surface: " + \Surface
Debug "Longueur: " + \Longueur
Debug "Largeur : " + \Largeur
Debug "Longueur diagonale; " + \LongueurDiagonale
Debug "Est carré " + \EstCarre
EndWith
Debug " "
CreerRectangle(2, 4, 20)
With *Rectangle
Debug "Surface: " + \Surface
Debug "Longueur: " + \Longueur
Debug "Largeur : " + \Largeur
Debug "Longueur diagonale; " + \LongueurDiagonale
Debug "Est carré " + \EstCarre
EndWith
Re: Erreur dans une Macro
Publié : lun. 13/janv./2014 21:04
par Micoute
Bonsoir falsam et grand merci, c'est vrai que j'ai tendance à faire compliqué, mais fait par tes soins, ça parait beaucoup plus simple, je sens que je vais simplifier mes programmes, merci encore.
Re: [Résolu] Erreur dans une Macro
Publié : mar. 14/janv./2014 9:43
par Mesa
J'ai vérifié et toutes les macros de l'aide fonctionnent sous PB5.21LTS x86, il suffit de savoir sélectionner un texte en entier
Cet exemple fonctionne chez moi = pas d'erreur de compilation et donne le bon résultat.
Code : Tout sélectionner
Macro Guillemet
"
EndMacro
Macro Assertion(Expression)
CompilerIf #PB_Compiler_Debugger ; active uniquement l'assertion lorsque le débogueur est actif
If Expression
Debug "Assertion (Ligne " + #PB_Compiler_Line + ") : " + Guillemet#Expression#Guillemet
EndIf
CompilerEndIf
EndMacro
Assertion(10 <> 10) ; N'affichera rien
Assertion(10 <> 15) ; Devrait afficher l'assertion
Mesa.
Re: [Résolu] Erreur dans une Macro
Publié : mar. 14/janv./2014 11:53
par Backup
ha oui !

Re: [Résolu] Erreur dans une Macro
Publié : mar. 14/janv./2014 19:01
par Demivec
Une autre option à l'aide Bool ():
Code : Tout sélectionner
Macro EstCarre(Id)
StringField("Non Oui", Bool(Longueur(Id) = Largeur(Id)) + 1, " ")
EndMacro
Re: [Résolu] Erreur dans une Macro
Publié : dim. 19/janv./2014 18:56
par Micoute
Bonsoir Demivec et merci beaucoup pour ta macro qui est exactement ce que je voulais et veuille aussi m'excuser pour mes remerciements tardifs.
Re: [Résolu] Erreur dans une Macro
Publié : lun. 20/janv./2014 1:48
par Demivec
Micoute a écrit :Bonsoir Demivec et merci beaucoup pour ta macro qui est exactement ce que je voulais et veuille aussi m'excuser pour mes remerciements tardifs.
Avec plaisir, il était un bon casse-tête.
