macro procedure

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

macro procedure

Message par chikun »

Bonjour,

Ou trouver une doc ou tuto basic (très simple quoi) de ces deux instructions qui me semble intéressantes voir indispensables, c pas évident ce que j'ai trouvé sur le web.

Merci par avance
jbernard13
Messages : 1501
Inscription : dim. 18/avr./2004 15:04
Localisation : sud de la france

Message par jbernard13 »

bonjour

va voir sur lien :
http://tripamort.free.fr/tuto.php

ou fait une recherche sur ce forum ...
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

:( g du mal pour les macros
:D compris pour les PROCEDURES, merci Dobro sur TON prg (fourmi) ki m'a permi de comprendre...bon voilà qu'il y a "Global" maintenant... accroche toi Jeannot
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

pour les procedures c'est assez simple a comprendre

c'est comparable a un circuit integré (si tu as fait un peu d'electronic)

pour les circuits integrés ;
tu as des Pattes d'entrés d'information
un traitement effectué dans le circuit integré
puis une ou plusieurs pattes de sortie de l'information modifié !!

une procedure c'est pareille !! :)


tout d'abord le nom du circuit integré , et les pattes d'entrés :

Code : Tout sélectionner

Procedure.S and444(a.S,b.S)
ici notre circuit s'appelle donc "and444" , c'est un circuit ET logique
dont le but sera de récuperer les signaux d'entré (a et b )
et d'effectuer un ET logique
remarque que notre procedure va nous sortir un resultat sous forme de "string"
c'est indiqué apres le procedure.s


c'est a dire si a="%011", et que b ="%010"

011
010
----
010 ; puisque seulement la deuxieme position contient 1 en haut et en bas
le resultat devra donc etre "10" en binaire

ensuite le traitement a l'interieur de notre circuit integré

Code : Tout sélectionner

  c1.S=Bin(Val(a) & Val(b)) 

puis les (la) patte de sortie qui va nous renvoyer le résultat de notre opération

Code : Tout sélectionner

 ProcedureReturn c1
c1 sera notre patte de sortie , elle renverra le resultat de l'opération :)

on peut refermer notre boitier de circuit integré :)
avec :

Code : Tout sélectionner

EndProcedure
********************************


voici le code du circuit and logique au complet

Code : Tout sélectionner

Procedure.S and444(a.S,b.S)
    c1.S=Bin(Val(a) & Val(b)) 
    ProcedureReturn c1
EndProcedure
on peu l'utiliser de cette façon :)

Code : Tout sélectionner

Resultat.S=and444("%011","%010")

Debug Resultat
comme tu vois on a cree un circuit integré
qui accepte 2 entrés au format Chaine

et qui opere un And logique entre les 2 pattes d'entré
et qui nous renvoi le resultat en chaine sur sa patte de sortie :)
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

Dobro:...je vois que tu utilises "procédure" pour les tests de sortie d'écran, ça me fait dire que c'est comme des sortes de "gosub/return"

la procédure est appelé par un nom, alors s'exécute la routine inclus dans la procédure, puis la suite du prg après l'appel ...
je me trompe ?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chikun a écrit :Dobro:...je vois que tu utilises "procédure" pour les tests de sortie d'écran, ça me fait dire que c'est comme des sortes de "gosub/return"

la procédure est appelé par un nom, alors s'exécute la routine inclus dans la procédure, puis la suite du prg après l'appel ...
je me trompe ?
oui tu peux considérer "procedure-endprocedure"
comme un "label: - Return"

du point de vue tracage du prg c'est semblable

mais la difference c'est que dans une procedure (fonction)

les variables créé a l'interieur sont locale a la procedure

c'est a dire que variable nommé "A" a l'interieur ne sera pas la meme variable
qu'un "A=2" a l'exterieur de la procedure !!

exemple :





Code : Tout sélectionner

a=20 ; on atribu la valeur 20 au A a l'exterieur de la procedure

Procedure.S and444()
    a=10 
    Debug "la A a l'interieur de la procedure "+Str(a)
   EndProcedure

and444() ; appel de la procedure

Debug "la A a l'exterieur de la procedure " +Str(a)
; comme tu vois le A a l'exterieur de la procedure n'a pas ete influencé
; par le A de l'interieur !!

mais surtout la grosse difference
c'est qu'une procedure est faite pour faire un traitement en interne
et de renvoyer un resultat !!

meme si tu peux faire des procedures sans parametres (entrés) et ou sans sortie (procedurereturn )

:)

cependant une variable a l'interieur de la procedure
peut etre partagé a l'exterieur grace a "Shared"

je reprends l'exemple de tout a l'heure :

Code : Tout sélectionner

a=20 ; on atribu la valeur 20 au A a l'exterieur de la procedure

Procedure.S and444()
    Shared a
    a=10 
    Debug "la A a l'interieur de la procedure "+Str(a)
   EndProcedure

and444() ; appel de la procedure

Debug "la A a l'exterieur de la procedure  a ete modifié par la procedure" +Str(a)
; comme tu vois le A a l'exterieur de la procedure n'a pas ete influencé
; par le A de l'interieur !!


mais on peut aussi influencer une variable se trouvant DANS la procedure

si celle ci est declaré Global

exemple :



Code : Tout sélectionner

Global a=20 ; on atribu la valeur 20 au A a l'exterieur de la procedure

Procedure.S and444()
    Debug "la A a l'interieur de la procedure  est  le A qui se trouve a l'exterieur car il est global "+Str(a)
    ; en etant globale, le A n'est pas protegé par les "mur" de la procedure
   EndProcedure

and444() ; appel de la procedure

Debug "la A a l'exterieur de la procedure reste le meme :" +Str(a)
; comme tu vois le A a l'exterieur de la procedure n'a pas ete influencé
; par le A de l'interieur !!


toutefois pour quand meme ne pas risquer d'avoir une variable qui serai global
influencer une variable du meme nom l'interieur d'une procedure , on
peut demander a ce qu'elle soit protegé !!

par protected

Code : Tout sélectionner

Global a=20 ; on atribu la valeur 20 au A a l'exterieur de la procedure

Procedure.S and444()
    Protected a
    a=10
    Debug "la A a l'interieur de la procedure n' est pas le A qui se trouve a l'exterieur car il est protegé  "+Str(a)
    ; on a protegé le A qui se trouve dedans , comme ça le A a l'exterieur est global
    ; sauf dans notre procedure
   EndProcedure

and444() ; appel de la procedure

Debug "la A a l'exterieur de la procedure reste le meme :" +Str(a)
; comme tu vois le A a l'exterieur de la procedure n'a pas ete influencé
; par le A de l'interieur !!
voila tu sais tout :)
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

:D g bien compris et puisque tu es "là", un lien simple pour les macros ou un exemple?
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

ben la doc est clair :)
Les macros


Syntax
Macro <nom> [(Parametre [, ...])]
...
EndMacro

Description

Le système de macro est une fonctionnalité très puissante, principalement utile pour les programmeurs chevronnés. Une macro est un bout de code quelconque (un mot clef, une ligne, plusieurs lignes) qui peut être inséré à n'importe quel endroit dans le code source en indiquant le nom de la macro. En ce sens, une macro est différente d'une procedure, car les procédures ne dupliquent pas leur code à chaque appel.

La déclaration Macro : EndMacro doit être effectuée avant le premier appel à la macro. Comme les macros seront complètement remplacées par le code correspondant au moment de la compilation, elles ne sont pas locales à une procédure.

Une macro ne peut pas avoir un type de retour, ou des paramètres typés, car cela n'a pas de sens. Quand une macro a des paramètres, ils sont remplacés dans le code de la macro par l'expression littérale qui a été passée lors de l'appel. Aucune évaluation n'est faite à ce stade, 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.

Les macros sont divisées en deux catégories: les simples (sans paramètres) et les complexes (avec paramètres, obligation d'utiliser les parenthèses pour les appeler). Quand aucun paramètre n'est spécifié, il est possible de remplacer n'importe quel mot avec un autre mot (ou une autre expression). Les macros peuvent être utilisées de manière récursive, mais si un des paramètres passés contient le caractère de concaténation '#', il ne sera pas géré.
Exemple: Macro simple


Macro MonNot
Not
EndMacro

a = 0
If MonNot a ; Ici la ligne sera remplacée par : 'If Not a'
Debug "Ok"
EndIf

En utilisant les paramètres, il est possible de créer des macros très flexibles. Le caractère de concaténation '#' est disponible pour créer des nouveaux mots ou labels en combinant le code de la macro et l'expression passée en paramètre (les espaces ne sont pas acceptées entre chaque mots devant être concaténés). Il est aussi possible de définir des valeurs par défaut pour chaque paramètre, pour qu'ils puissent être omis lors de l'appel de la macro.
Exemple: Macro avec paramètres

Macro BoiteDeMessageEnMajuscule(Titre, Corps)
MessageRequester(Titre, UCase(Corps), 0)
EndMacro

Texte$ = "le Monde"
BoiteDeMessageEnMajuscule("Salut", "-"+Texte$+"-") ; Ici la ligne sera remplacée comme ça :
; MessageRequester("Salut", UCase("-"+Texte$+"-"), 0)

Exemple: Macro avec paramètre par défaut

Macro BoiteDeMessageEnMajuscule(Titre, Corps = "Ah, aucun corps spécifié")
MessageRequester(Titre, UCase(Corps), 0)
EndMacro

BoiteDeMessageEnMajuscule("Salut") ; Ici la ligne sera remplacée comme ça :
; MessageRequester("Salut", UCase("Ah, aucun corps spécifié"), 0)

Exemple: Macro et concaténation

Macro XCase(Type, Texte) ; renvoie le texte dans la casse du type spécifié
Type#Case(Texte) ; Type U => MAJUSCULES
EndMacro ; Type L => minuscules

Debug XCase(U, "Salut") ; macro remplacée par UCase("Salut")
Debug XCase(L, "Salut") ; macro remplacée par LCase("Salut")


Exemple: Macro complexe sur plusieurs lignes

Macro Guillemet
"
EndMacro

Macro Assertion(Expression)
CompilerIf #PB_Compiler_Debugger ; active uniquement assertion lorsque le débogueur est actif
If Expression
Debug "Assertion (Ligne " + Str(#PB_Compiler_Line) + ") : " + Guillemet#Expression#Guillemet
EndIf
CompilerEndIf
EndMacro

Assertion(10 <> 10) ; N'affichera rien
Assertion(10 <> 15) ; Devrait afficher l'assertion

en clair tu peux utiliser les macro pour franciser le langage basic par exemple

pour ouvrir une fenetre en simplifiant moins de parametres
et en francisant :

Code : Tout sélectionner


Macro ouvre_fenetre( x, Y,titre )
    Resultat = OpenWindow(1, x, Y,640, 400, titre, #PB_Window_SystemMenu  ) 
    Repeat
        Event=WaitWindowEvent()
        If Event = #PB_Event_CloseWindow  ; If the user has pressed on the close button
            Quit = 1
        EndIf
        
    Until Quit = 1 
EndMacro 



; dorenavent tu peux ouvrir une fenetre avec  "ouvre_fenetre()"

ouvre_fenetre( 100, 100,"titre"  )
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

8O oula, ben non , tu vois à mon stade c pas tres clair; J'avais deja consulté cette page.
Me faut des ti exemples comme çelui là :lol:
g du me debrouiller tout seul, si ce n'est pas tout, c au moins la base

Code : Tout sélectionner


;@ Chikun 

EcranX = GetSystemMetrics_(#SM_CXSCREEN) ;1280
EcranY = GetSystemMetrics_(#SM_CYSCREEN) ;800
InitSprite() : InitKeyboard()
OpenScreen (EcranX, EcranY, 32, "Test")



Macro test
If a>200
End

EndIf
EndMacro


Repeat
ExamineKeyboard() 
a=a+1
test
Debug a
Until KeyboardPushed(#PB_Key_Escape)
End
mais je m'y perd un peu entre la macro et la procedure, fo ke je bosse...
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

..........
Dernière modification par Backup le sam. 01/oct./2011 13:01, modifié 1 fois.
Anonyme

Message par Anonyme »

tout simple :

Macro Jen_Ai_Marre_Decrire_Endif
EndIf
EndMacro



If A=A
Debug "C cool les macro"
Jen_Ai_Marre_Decrire_Endif

:wink:
Geo Trouvpatou
Messages : 471
Inscription : dim. 23/déc./2007 18:10

Message par Geo Trouvpatou »

Salut.

Une macro est un peu comme le "chercher-remplacer" de word par exemple, avant que ton code ne devienne un .exe
chikun
Messages : 185
Inscription : sam. 21/juin/2008 13:36

Message par chikun »

Dobro
:D tu ne pouvais pas être plus clair :wink: ça fait "sale" d'utiliser de la place mémoire pour rien.. mais pour celui qui cherche le gain de temps coute que coute, ça peut être intéressant, car le prg ne fais pas des aller retour en mémoire..

merci, mais dit moi , dans une procedure, peut on utiliser des instructions comme de veritable programme à part ? tout fonctionne? plot, debug, sprite..

Cpl.Bator
mdrr, ok ..
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

chikun a écrit :merci, mais dit moi , dans une procedure, peut on utiliser des instructions comme de veritable programme à part ? tout fonctionne? plot, debug, sprite..

Cpl.Bator
mdrr, ok ..
oui ! tout marche !

tu peux meme appeler la procedure dans la procedure

ça s'appelle de la récursivité ! ;)
allasktulu
Messages : 34
Inscription : sam. 29/nov./2008 22:42

Message par allasktulu »

Pour les macro, il y a un exellent tuto ici :

http://drac.site.chez-alice.fr/Tutorial ... _Macro.htm

:D
Répondre