[Résolu] Erreur dans une Macro

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

[Résolu] Erreur dans une Macro

Message 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"
Dernière modification par Micoute le lun. 13/janv./2014 21:05, modifié 1 fois.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
MLD
Messages : 1124
Inscription : jeu. 05/févr./2009 17:58
Localisation : Bretagne

Re: Erreur dans une Macro

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

Re: Erreur dans une Macro

Message 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 ....
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Erreur dans une Macro

Message 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 :).
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
falsam
Messages : 7324
Inscription : dim. 22/août/2010 15:24
Localisation : IDF (Yvelines)
Contact :

Re: Erreur dans une Macro

Message 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
Configuration : Windows 11 Famille 64-bit - PB 6.20 x64 - AMD Ryzen 7 - 16 GO RAM
Vidéo NVIDIA GeForce GTX 1650 Ti - Résolution 1920x1080 - Mise à l'échelle 125%
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Erreur dans une Macro

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Mesa
Messages : 1126
Inscription : mer. 14/sept./2011 16:59

Re: [Résolu] Erreur dans une Macro

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

Re: [Résolu] Erreur dans une Macro

Message par Backup »

ha oui ! :oops:
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: [Résolu] Erreur dans une Macro

Message 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
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: [Résolu] Erreur dans une Macro

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: [Résolu] Erreur dans une Macro

Message 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. :)
Répondre