Page 1 sur 1

Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 0:43
par Brayane
Bonsoir,

Je viens demander conseil car j'ai du mal avec les Macro que j’essaie de comprendre.

Code : Tout sélectionner

Macro EnregistrerInformationVariable(NomVariable, Variable) 
  
  Debug NomVariable
  Debug Variable

EndMacro

MaVariable1 = 123
MaVariable2.s = "Xyz"

EnregistrerInformationVariable(123, "Hdv")
Bon, premier problème, comment identifier le type du contenu entrant dans la macro ?

Je voudrait dire que si "NomVariable" n'est pas une chaîne de caractères, alors que ça soulève une erreur.
Je voudrait dire que si "Variable" n'est pas une variable, alors que ça soulève une erreur.

Je me complique surement la vie...
Mais quel intérêt alors que la macro prenne n'importe quoi à manger hein si ont peut pas identifier un type qui entre ?

En faite j'essaie de faire entrer n'importe quel type de variable par le paramètre "Variable"
mais bon c'est surement pas la bonne méthode à faire...

C'est comme dans une procédure, faut forcément un type prédéfini et là est le problème !

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 8:15
par Ollivier
Une macro c'est un copier/coller automatisé exécuté lors de la compilation. C'est donc absolument transparent à l'exécution seule.

Sa syntaxe peut s'apparenter parfois à une procédure. Mais ce n'est qu'une coïncidence.

Le type ne peut pas être analysé: pourquoi? Parce qu'il y a trop de possibilités différentes d'écriture d'une variable dans un code.

Il faut prendre le mal à la racine, et savoir détecter ce qui va définir une variable.

Soit c'est explicite, dans ce cas, il faut présenter au compilateur la variable au préalable.

Ex:

Code : Tout sélectionner

Global MaVariable.I
C'est le suffixe '.I' qui précise que c'est un entier.

Soit ça ne l'est pas. Si ça n'est pas explicite, le compilateur estime que toute nouvelle variable non précisée est un nombre entier.

Je ne raconte pas le nombre de formes possibles d'apparition de variable!

Essaie de voir les macros 'Definit' et 'Guillemet' dans le sujet précédent, et tente de créer ta propre macro pour 'shunter' Global.

Je dois m'absenter plusieurs jours. J'espère que tu auras pu avancer comme tu veux. Mais je dois avouer que tu t'es donné des objectifs élevés. Heureusement, je ne suis pas tout seul pour aider!

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 8:20
par Micoute
Bonjour Brayane, as-tu essayé avec :

Code : Tout sélectionner

EnregistrerInformationVariable(MaVariable1, MaVariable2)
Pour ne pas te tromper avec le type de la variable, fais des tests avec TypeOf(), très bien expliqué dans le fichier d'aide.

Tu peux aussi faire une macro comme ceci :

Code : Tout sélectionner

Macro adapter(variable)
   Select TypeOf(variable)
      Case #PB_Double
         resultat.d = PeekD(@variable)
         
      Case #PB_String
         resultat.d = ValD(PeekS(@variable))
         
   EndSelect
EndMacro

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 8:49
par Ollivier
@Micoute

Version 5.22 LTS ça marche aussi! TypeOf() fonctionne bien.

Les différents codes de sortie sont indiquées ici:
http://www.purebasic.com/documentation/ ... tions.html

Merci beaucoup Micoute!

@Brayane

Micoute vient d'apporter une solution qui t'évite l'acrobatie que je fais dans la macro 'Definit()'.

Si tu as d'autres questions, n'hésite pas!

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 16:38
par Brayane
Salut,

Un détail prêt, déjà essayer ça et ça marche pas du tout :lol:
Imagine que c'est une chaîne ou un nombre qui passe par la variable, là tu est.... couic

Donc non ça ne fonctionne pas !
Merci quand même Micoute et ollivier !

Voila pour illustrer mes propos:

Code : Tout sélectionner

Macro EnregistrerInformationVariable(NomVariable, Variable) 
  
  Select TypeOf(Variable)
      
    Case #PB_Character
      
    Case #PB_Ascii
      
    Case #PB_Byte
      
    Case #PB_Long
      
    Case #PB_Integer
      
    Case #PB_Float
      
    Case #PB_Double
      
    Case #PB_Quad
      
    Case #PB_String
      
  EndSelect
  
  Select TypeOf(NomVariable)
      
    Case #PB_Character
      
    Case #PB_Ascii
      
    Case #PB_Byte
      
    Case #PB_Long
      
    Case #PB_Integer
      
    Case #PB_Float
      
    Case #PB_Double
      
    Case #PB_Quad
      
    Case #PB_String
      
  EndSelect
  
EndIf

EndMacro

MaVariable1 = 123
MaVariable2.s = "Xyz"

EnregistrerInformationVariable(123, MaVariable2.s) ; Bug sur les deux champs
EnregistrerInformationVariable(123, "Abc") ; Bug sur les deux champs
EnregistrerInformationVariable(MaVariable2.s, 123) ; Bug sur les deux champs
EnregistrerInformationVariable("Abc", 123) ; Bug sur les deux champs

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 17:19
par G-Rom
une macro n'est autre qu'une astuce qui consiste à être remplacer durant la compilation, ex :

Code : Tout sélectionner

Macro div2( value )
 value / 2
endmacro

MaVar = div2( 50 )
Le compilateur va remplacer les macro de cette manière :

Code : Tout sélectionner

MaVar = 50 / 2
la macro disparais donc de ton programme final.

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 18:06
par Brayane
Merci, oui, le code est remplacer comme tu le dis.
C'est dommage.... VB lui permet de créer plusieurs fonctions avec des paramètre différent...

Exemple:

Code : Tout sélectionner

Function MaFunction(ByVal MaVariable As Integer)

End Function

Function MaFunction(ByVal MaVariable As String)

End Function

Function MaFunction(ByVal MaVariable As Long)

End Function

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 18:10
par G-Rom
Tu mélanges tout , une fonction est une fonction, une macro une directive pour la précompilation.
Rien ne t'empeches de créer toi même ton système de variable , comme je t'ai expliquer ultérieurement , ou retourné sur vb.

Re: Problème macro (Valeur multiple)

Publié : dim. 30/août/2015 19:39
par Ollivier
brayane

Ça c'est un nouveau problème.
Tu veux un dicernement entre une valeur immédiate et une valeur variable.