PureBasic

Forums PureBasic
Nous sommes le Dim 22/Sep/2019 23:41

Heures au format UTC + 1 heure




Poster un nouveau sujet Répondre au sujet  [ 15 messages ] 
Auteur Message
 Sujet du message: Comportement inexplicable des maquereaux
MessagePosté: Dim 22/Juil/2018 23:05 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 33
Localisation: France
Bonjour à tous et à toutes.

Cet après midi j'ai fait quelques expériences avec les macros et je suis tombé sur des comportements ... originaux. Je vous partage les codes.

Si je remplace le nom d'une macro par son contenu, je suis bien sensé avoir la même chose ?
Code:
Macro Chrono(code, message=MacroExpandedCount)
   debut.q = ElapsedMilliseconds()
   For i = 1 To 1000000
      code
   Next
   fin.q = ElapsedMilliseconds()
   Debug "Test : " + message
   Debug "Temp : " + Str(fin-debut) + "ms"
EndMacro

Macro Example
   a=1: a+1
EndMacro

Chrono(Example, "Assignation")
Chrono(a = 1: a+1, "Assignation")


Si j'ai bien compris, c'est bien le contenu qui appelle le nom de la macro ?
Code:
Macro titi
   Debug "Et gros minet"
EndMacro

Macro toto
   tata
EndMacro

Macro toto()
   titi
EndMacro

Macro tata()
   Debug "Bonjour ma tante !"
EndMacro

toto()
Note : essayez de changer le contenu de chacune des macros "toto" ou de changer celle qui à les parenthèses.
EDIT : J'utilise PB 5.62 (x64) sous windows 8.1


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Lun 23/Juil/2018 10:01 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8750
Ton
Code:
macro toto
tata
endmacro


Ne veut rien dire, vu que tu as mis de parenthèses à tata pour la macro tata()
De plus, une macro sans parenthèse sert éventuellement à remplacer une commande (un alias)

Il est préférable d'utiliser des valeurs entre parenthèses pour tes macros.
Code:

Macro tata(text1,text2)
  Debug text1 + " " + text2
EndMacro

Tata ("bonjour","tata Michèle")


Macro toto(arg1)
 
  arg1
 
EndMacro

toto (tata("coucou","la voilà"))

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Lun 23/Juil/2018 18:17 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 33
Localisation: France
Ar-S a écrit:
Ton
Code:
macro toto
tata
endmacro


Ne veut rien dire,
C'est l'ensemble du deuxième code qui est purement inutile. :wink:

J'ai mis les deux codes pour montrer le bizarreries générées par le compilateur.
Pour le second code il s'agit d'une double erreur :
Citation:
Ligne 13 : Erreur de syntaxe.

La ligne 13 c'est la ligne "Macro tata()". C'est un début de déclaration de macro tout à fait normal. Cette erreur d'affiche en même temps que l'erreur de macro suivante. Tout se passe donc à la même ligne.
Code:
Macro Debug "Et gros minet"

Que viens faire Gros Minet dans la déclaration de la macro tata() alors qu'il fait parti de la macro titi ???


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Lun 23/Juil/2018 19:00 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
Code:
Macro titi
   Debug "Et gros minet"
EndMacro

; Macro toto
;    tata
; EndMacro

Macro toto()
   titi
EndMacro

Macro tata()
   Debug "Bonjour ma tante !"
EndMacro

toto()


Dans ton "code" tu crée deux fois la macro toto. C'est normal que tu nimporte quoi en résulta si tu code nimporte quoi.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Lun 23/Juil/2018 21:23 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 33
Localisation: France
Meci boby.
Au départ je croyais que les macros simples et les macros avec paramètres étaient gérées séparément. Je voulais donc savoir laquelle des deux macros toto était appelé en premier.

Avec ta réponse, je pense enfin avoir compris ce qu’il se passe dans le second bout de code :
  1. Macro 1 : titi --> RAS
  2. Macro 2 : toto --> RAS
  3. Macro 3 : toto() --> La macro 2 remplace « toto » par « tata ». La macro 3 s’appelle donc « tata()»
  4. Macro 4 : tata() --> La macro 3 remplace « tata()» par « titi ». La macro 1 remplace ensuite « titi » par « Debug "Et gros minet"»

En revanche, cela n'explique pas pourquoi le caractère ":" est considéré comme une virgule dans le premier morceau de code .


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Lun 23/Juil/2018 22:25 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8750
Salut
Quelle virgule ?
Ce qui me gêne dans ton code c'est :
Code:
Chrono(a = 1: a+1, "Assignation")
les : signifient un retour à la ligne dans PB
;Donc c'est comme si tu faisais
Chrono (a = 1
a +1, "Assignation")

Je suis déjà étonné qu'il ni ait pas un message d'erreur plus hardcore. 8O

Dans ta macro tu indiques ensuite qu'il y aura 2 éléments, et non plus.
Code:
Macro Chrono(code, message=MacroExpandedCount)


Sinon tu veux faire quoi exactement.

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Mar 24/Juil/2018 6:20 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 33
Localisation: France
Ar-S a écrit:
Sinon tu veux faire quoi exactement.
Pour cette macro là, l'idée était de voir si l'on pouvait injecter du code dans une macro. En l’occurrence pour mesurer le temps d'exécution du code concerné.
Mais comme je l'ai mis dans mon premier message :
Naheulf a écrit:
Cet après midi j'ai fait quelques expériences avec les macros
Il n'y a pas vraiment de but précis.

Ar-S a écrit:
Ce qui me gêne dans ton code c'est :
Code:
Chrono(a = 1: a+1, "Assignation")
les : signifient un retour à la ligne dans PB
;Donc c'est comme si tu faisais
Chrono (a = 1
a +1, "Assignation")

Je suis déjà étonné qu'il ni ait pas un message d'erreur plus hardcore. 8O
Je suis d'accord avec toi. Je m'attendais soit à ce que ça fonctionne comme la ligne
Code:
Chrono(Example, "Assignation")
soit que le compiler me mette une erreur du type « Il manque une parenthèse fermante » ou « caractère ':' invalide à cette position ».

Ar-S a écrit:
Quelle virgule ?

Et du coup, pourquoi le compilateur semble lire la ligne
Code:
Chrono(a = 1: a+1, "Assignation")
comme si c'était
Code:
Chrono(a = 1, a+1, "Assignation")
D'où ma question : Pourquoi le caractère ":" est/semble être considéré comme une virgule dans les paramètres d'appel de la macro ?


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Mar 24/Juil/2018 8:08 
Hors ligne

Inscription: Sam 08/Fév/2014 15:19
Messages: 1595
Il est plus rapide de filtrer la correspondance à une syntaxe et de rejeter ce qui ne correspond pas.

Par exemple, le manque de parenthèse provoque un "syntax error" et c'est tout.
Le programmeur doit savoir relire et appuyer sur F1, sans oublier que la syntaxe s'affiche toujours en barre d'état, même pour les fonctions et macros qu'on a défini soi-même.

On ne peut pas, avoir un compilateur rapide, léger et stable et demander de traiter tous les types d'erreur possibles, sinon, on se retrouve avec un produit qui occupe plusieurs Go sur le disque et qui met plusieurs secondes pour compiler "Hello World" là où PB est instantané.

:wink:

_________________
Windows 10 Famille x64 + Linux (Slackware, Debian sur Oracle VirtualBox 6.0)


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Mar 24/Juil/2018 15:28 
Hors ligne

Inscription: Jeu 07/Juin/2007 22:54
Messages: 261
En fait le but d'une macro c'est simplement d'éviter d'avoir plusieurs fois le même code dans ton code (ouais ça fait beaucoup de fois code...)
Quand tu fais appel à ta macro, c'est comme si tu faisais un copier coller du code contenu dans ta macro à l'endroit ou tu l'appel... Je ne voie pas trop ce qu'il pose problème du coup.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Mar 24/Juil/2018 17:07 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8750
@Naheulf
Oui il est bon de le préciser. Une Macro c'est vraiment simplement de l'alias. A ne pas confondre avec la procédure qui elle pourra être appelé plusieurs fois mais n'aura été créé qu'une fois par le prog.

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Ça nage, ça nage pas ... c'est pas constant
MessagePosté: Jeu 26/Juil/2018 23:09 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 33
Localisation: France
Bonjour,

Dans la série des codes cheloux je vous présente l’intrus : Celuis qui n'aaucune raison de boguer. (Enfin à mon avis)
Code:
Macro Mode
   2
EndMacro

CompilerIf Mode = 1
   Debug "Mode 1"
CompilerElseIf Mode = 2
   Debug "Mode 2"
CompilerEndIf

Génère l'erreur "Ligne 7: Une expression numerique literale est attendue pour les directives de compilation".
En revanche ça marche avec une constante à la place de la macro. Pourtant les deux sont censés être remplacé par leurs valeurs à la compilation... Bizarre

PS : Oui j'aime les jeux de mots à une balle.


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Jeu 26/Juil/2018 23:47 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 09/Oct/2005 16:51
Messages: 8750
Citation:
Doc : CompilerIf <expression constante>


ça ne fonctionnera pas non plus avec des macros.
Meme si tu fais

Code:
  Macro Mode
     #PB_Compiler_Processor
  EndMacro

CompilerIf Mode = #PB_Processor_x86
   Debug "Mode 1"
 
CompilerElseIf Mode = #PB_Processor_x64
    Debug "Mode 2"
  CompilerEndIf


Il te faudra mettre la constante

Code:
CompilerIf #PB_Compiler_Processor = #PB_Processor_x86
   Debug "Mode 1"
 
CompilerElseIf #PB_Compiler_Processor = #PB_Processor_x64
    Debug "Mode 2"
  CompilerEndIf

_________________
~~~~Règles du forum ~~~~
.: Ar-S :. Tour + portable W10 x64 PB 5.4x / 5.6x
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
RESIZER GOLD : Mon logiciel de redimensionnement par lot 100% PB


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Ven 27/Juil/2018 6:15 
Hors ligne
Avatar de l’utilisateur

Inscription: Dim 10/Mar/2013 22:22
Messages: 33
Localisation: France
Doc Purebasic a écrit:
les macros seront complètement remplacées par le code correspondant au moment de la compilation
Doc Purebasic a écrit:
ce qui est très important à comprendre: l'évaluation de la ligne ne commence uniquement lorsque toutes les macros trouvées sur cette ligne ont été traitées.

Donc pour moi, le traitement du CompilerIf / CompilerElseIf ne devrait même pas voir qu'il y a une macro sur la ligne.

Or j'ai l'impression que le traitement du CompilerIf court-circuite les macros.
Code:
Macro CEI : CompilerElseIf : EndMacro

CompilerIf 2 = 1
   Debug "Mode 1"
CEI #True ; devrait être équivalent à "CompilerElseIf #True"
   Debug "Mode 2"
CompilerElse
   Debug "Autre"
CompilerEndIf
Ce code affiche "Autre"


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Sam 28/Juil/2018 1:17 
Hors ligne

Inscription: Ven 29/Juin/2007 17:50
Messages: 3492
Le CompilerElseIf c'est fait pour te simplifier la vie sur le plan logique, pas sur le plan syntaxique. Il faut prendre en compte les priorités de compilation pour obtenir une simplification globale.

Tu fais une macro correcte (c'est-à-dire avec un cadre respectant les priorités du compilateur, et un objectif correspondant, à savoir se simplifier la vie).
Code:
Macro Cpl(Alpha, Beta, Gamma)

CompilerIf (Alpha)

  Beta

CompilerElse

  Gamma

CompilerEndIf

EndMacro


Le résultat, c'est que ça te simplifie la vie.
Code:
Cpl(1,
   Debug "Mode 1",
   Cpl(1,
      Debug "Mode 2",
      Debug "Autre") )


Haut
 Profil  
Répondre en citant le message  
 Sujet du message: Re: Comportement inexplicable des maquereaux
MessagePosté: Lun 15/Oct/2018 20:29 
Hors ligne
Avatar de l’utilisateur

Inscription: Jeu 29/Jan/2004 0:26
Messages: 2433
Localisation: Nantes
A mon humble avis, ca s'explique facilement,

CompilerIf/Else/Endif c'est du préprocesseur
Les macros sont aussi du préprocessing.

A priori, donc, le compilateur traite les directives de compilation avant les macros, ce qui je pense est logique.

Cela signifie donc que le compilateur ne connait les macros qu'après cette étape.

_________________
Image


Haut
 Profil  
Répondre en citant le message  
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 15 messages ] 

Heures au format UTC + 1 heure


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages

Rechercher:
Aller à:  
cron

 


Powered by phpBB © 2008 phpBB Group | Traduction par: phpBB-fr.com
subSilver+ theme by Canver Software, sponsor Sanal Modifiye