Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 14:40 Titel: Macro mit included |
|
|
Mal eine "ungewöhnliche" frage...
Man stelle sich vor, man möchte ein macro erstellen.. das soll ja vorkommen. Also ein Metabefehl, der beim compilieren durch vorgegebene kommandos ersetzt wird.
Code: |
#macro testen(p1, p2)
...
#endmacro
|
Nun möchte ich aber den inhalt des macros "testen" in eine separate quelltext-datei auslagen. Dazu hatte ich mir folgendes vorgestellt:
Code: |
#macro testen(p1, p2)
#include "test-macro.mcr"
#endmacro
|
der inhalt der datei "test-macro.mcr" könnte dann sein:
Code: |
print p1 + p2 & " ist die Summe beider Zahlen"
print p1 * p2 & " ist das Produkt aus beiden Zahlen"
|
Mir gehts dabei um die übersichtlichkeit und komfort beim programmieren. Das Macro soll explizit !einzeln! zu bearbeiten sein und nicht mitten, oberhalb oder unterhalb des kompletten quelltextes stehen.
Leider funktioniert meine Idee mit #include nicht. D.h. die Parameter des Macros werden nicht an die zu includierende datei durchgereicht..
Weiss jemand, wie es funktionieren könnte?
Vielen Dank schon mal!! |
|
Nach oben |
|
 |
28398
Anmeldungsdatum: 25.04.2008 Beiträge: 1917
|
Verfasst am: 04.01.2010, 15:35 Titel: |
|
|
Du erstellst zwei lokale Variablen, wenn diese noch nicht definiert sind (erstmalige Verwendung des Makros in einem Scope, ifndef), und weist diesen p1 und p2 zu. Funktioniert natürlich nur bei bekannten Datentypen. (Oder per Cast, das funktioniert aber auch nur bei Standarddatentypen und Datentypen, für die der Cast-Operator definiert ist.) |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 15:44 Titel: |
|
|
Lokale variablen definiere ich an der stelle ungerne weil ich lieber mit "universellen" bezeichnern im macro arbeiten möchte.
Gibt es keinen meta-befehl, der ähnlich wie #include, den inhalt einer text-datei in die quelltext-datei hart "importiert" ? .. wie eine art "inline-text-import" .. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.01.2010, 15:50 Titel: |
|
|
Ich würde ja vorschlagen, einfach das gesamte in eine Macro.bas zu stecken und im Programm selbst nur den #Include auf diese Datei. Somit wär es getrennt und es würde auch funktionieren, oder sehe ich das falsch? |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 16:55 Titel: |
|
|
@Mod: So unrecht hast du da nicht! Leider ist mein ziel etwas komplizierter, denn was ich in meinem beispiel nicht erwähnt hatte ist, dass der name der datei, in der das macro steht, ein parameter des macros sein soll ... und bevor und nachdem die include-file in den quelltext geladen wird, soll auch noch was passieren:
Also so in etwa:
Code: |
#macro testen(mfile, p1, p2)
print "Macro wird gestartet..."
#include mfile
print "Macro beendet!"
#endmacro
testen("test-macro.mcr", 10, 20)
|
(Der grund, warum ich das nicht erwähnt hatte war, weil ich das beispiel nicht kompliziert als nötig machen wollte) |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.01.2010, 17:03 Titel: |
|
|
Schaut mir sehr nach einer Art Plugin-System aus. Dazu gäbe es im FreeBasic-Portal ein Tutorial, allerdings mit DLLs.
Mach es so:
Code: | #MACRO testen(mfile, p1, p2)
PRINT "MACRO wird gestartet..."
Print p1, p2
#Include mfile
macro(p1, p2)
Print p1, p2
PRINT "MACRO beendet!"
#ENDMACRO
testen("macro.mcr", 10, 20) |
Code: | Sub macro(p1 As Integer , p2 As Integer)
PRINT p1 + p2 & " ist die Summe beider Zahlen"
PRINT p1 * p2 & " ist das Produkt aus beiden Zahlen"
End Sub |
Die Variablen sind das Problem und so umgehst du das Problem, weil du die Variablen übergibst.
Zuletzt bearbeitet von MOD am 04.01.2010, 17:20, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 17:19 Titel: |
|
|
Ein Plugin-System ist das so nicht.. weils ja statisch compiliert wird. Es soll eher eine art "übersichtliche API" werden. |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 04.01.2010, 17:19 Titel: |
|
|
Wie wärs denn so:
makro.bas:
Code: | #MACRO testen(mfile, p1, p2)
#INCLUDE mfile
m(p1,p2)
#endMacro
testen("makro.bi",5,7)
testen("makro2.bi",5,7)
testen("makro2.bi",5,7)
testen("makro.bi",5,7)
sleep |
makro.bi:
Code: | #undef m
#MACRO m(p1, p2)
print p1,p2
#endMacro |
makro2.bi:
Code: | #undef m
#MACRO m(p1, p2)
print p2,p1
#endMacro |
Ausgabe:
5, 7
7, 5
7, 5
5, 7
Wenn ich dich richtig verstanden habe tut der Quelltext genau das was du willst. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.01.2010, 17:21 Titel: |
|
|
Da war ich wohl zu langsam, hab oben nämlich was editiert  |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 17:27 Titel: |
|
|
@Stueber: Hm, gar nicht so schlecht! RESPEKT! .. auch ganz ähnlich wie MODs lösung, nur das er in der include datei eine sub aufruft.. hm.. Wenn es jetzt noch so wäre, das man in der include datei nicht mir "#macro m ..." beginnen und mit "#endmacro" aufhören müsste wärs perfekt!! .. am schönsten wäre eine "saubere" include-datei, in der nur Quelltext stünde.. also ohne das man den quelltext mit #macro und #endmacro einrahmen muss...
@MOD: Mit subs in der include datei wäre es schlecht! .. denn das makro könnte ja auch mal in einer scope verwendet werden. Da darf man keine subs/funktionen definieren. |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 04.01.2010, 17:38 Titel: |
|
|
Ganz ohne #makro und #endmacro wirds wohl nicht gehen, aber ich schau mal was sich machen lässt.
Edit: Habs mir gerade angesehen, kürzer als oben wirds nicht gehen. |
|
Nach oben |
|
 |
MOD Fleißiger Referenzredakteur

Anmeldungsdatum: 10.09.2007 Beiträge: 1003
|
Verfasst am: 04.01.2010, 17:50 Titel: |
|
|
Wie meinst du das OneCypher, der Aufruf meiner Lösung geht innerhalb einer For-Next, einer Do-Loop und einem Scope-End Scope, sogar alles auf einmal. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 17:55 Titel: |
|
|
@MOD: Ich bin mir eigentlich ziemlich sicher, dass man subs nicht innerhalb von scopes/subs/functions definieren darf..
Und bei der lösung von stueber ist noch etwas wichtiges zu erkennen: Er löscht den Bezeichner nach dem import der include-datei ( #undef m ). So das es bei einem 2. aufruf nicht zu einem fehler kommt.. |
|
Nach oben |
|
 |
Stueber
Anmeldungsdatum: 07.07.2008 Beiträge: 202
|
Verfasst am: 04.01.2010, 17:57 Titel: |
|
|
Ist das gut oder schlecht?
Bei mir gings nur so. |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 04.01.2010, 21:45 Titel: |
|
|
Ist ganz und gar nicht schlecht! sogar sehr gut, denn so solls sein
naja.. wäre der "macro-rahmen" in der include-datei nich... dann wärs absolut perfekt  |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 04.01.2010, 23:44 Titel: |
|
|
ohne Makro rahmen gehts auch, nur ists halt ein bisschen mehr Aufwand in der anderen Datei und du musst die Konstanten nicht mit allein ihrem Namen, sonder mit Name() ansprechen.
egal_wie_du_die_nennst.bas
Code: | #MACRO testen(mfile, var_p1)
print "Makro Beginn"
#ifdef p1
#undef p1
#endif
#macro p1()
var_p1
#EndMacro
#INCLUDE mfile
print "Makro Ende"
#ENDMACRO
testen("makro2.bi","OneCypher")
testen("makro2.bi","Stueber")
testen("makro2.bi","MOD")
testen("makro2.bi","28398")
SLEEP |
makro2.bi
Code: | print "Hallo "; p1() |
_________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 04.01.2010, 23:46 Titel: |
|
|
tschulding für den doppelpost, aber mit konstanten gehts ohne Klammern:
Code: | #MACRO testen(mfile, var_p1)
print "Makro Beginn"
#ifdef p1
#undef p1
#endif
const p1 = var_p1
#INCLUDE mfile
print "Makro Ende"
#ENDMACRO
testen("makro2.bi","OneCypher")
testen("makro2.bi","Stueber")
testen("makro2.bi","MOD")
testen("makro2.bi","28398")
SLEEP |
Nachteil: Du kannst keine andere Variable im Programm so nennen _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
OneCypher
Anmeldungsdatum: 23.09.2007 Beiträge: 802
|
Verfasst am: 05.01.2010, 00:16 Titel: |
|
|
@St_W: Ja, ich glaub, das mit der konstante ist klasse .. Hm .. aber auch die version die var_p1 in das macro p1() umleitet ist auch nich schlecht.. hm.. muss ich mal etwas mit experimentieren..
vielen vielen dank an euch alle!!!! Ich denke, das wird mir weiterhelfen!! |
|
Nach oben |
|
 |
|