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 :mrgreen:
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. :? :oops:

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 :

Code : Tout sélectionner

Macro MonNot
    Not
  EndMacro

  a = 0
   If Not a  ;
    Debug "Ok"
  EndIf
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 :lol:

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 ! :oops:

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. :)