macro procedure
macro procedure
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
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
-
- Messages : 1501
- Inscription : dim. 18/avr./2004 15:04
- Localisation : sud de la france
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 :
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é
puis les (la) patte de sortie qui va nous renvoyer le résultat de notre opération
c1 sera notre patte de sortie , elle renverra le resultat de l'opération 
on peut refermer notre boitier de circuit integré
avec :
********************************
voici le code du circuit and logique au complet
on peu l'utiliser de cette façon 
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
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)
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

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

Code : Tout sélectionner
Resultat.S=and444("%011","%010")
Debug Resultat
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

oui tu peux considérer "procedure-endprocedure"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 ?
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 !!
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 !!
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 !!

ben la doc est clair 
pour ouvrir une fenetre en simplifiant moins de parametres
et en francisant :

en clair tu peux utiliser les macro pour franciser le langage basic par exempleLes 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
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" )

Me faut des ti exemples comme çelui là

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
-
- Messages : 471
- Inscription : dim. 23/déc./2007 18:10
Dobro
tu ne pouvais pas être plus clair
ç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 ..


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 ..
-
- Messages : 34
- Inscription : sam. 29/nov./2008 22:42
Pour les macro, il y a un exellent tuto ici :
http://drac.site.chez-alice.fr/Tutorial ... _Macro.htm

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