Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Macro mit included

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 14:40    Titel: Macro mit included Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 04.01.2010, 15:35    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 15:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 04.01.2010, 15:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 16:55    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 04.01.2010, 17:03    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 17:19    Titel: Antworten mit Zitat

Ein Plugin-System ist das so nicht.. weils ja statisch compiliert wird. Es soll eher eine art "übersichtliche API" werden.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 04.01.2010, 17:19    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 04.01.2010, 17:21    Titel: Antworten mit Zitat

Da war ich wohl zu langsam, hab oben nämlich was editiert zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 17:27    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 04.01.2010, 17:38    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
MOD
Fleißiger Referenzredakteur


Anmeldungsdatum: 10.09.2007
Beiträge: 1003

BeitragVerfasst am: 04.01.2010, 17:50    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 17:55    Titel: Antworten mit Zitat

@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
Benutzer-Profile anzeigen Private Nachricht senden
Stueber



Anmeldungsdatum: 07.07.2008
Beiträge: 202

BeitragVerfasst am: 04.01.2010, 17:57    Titel: Antworten mit Zitat

Ist das gut oder schlecht? lächeln
Bei mir gings nur so.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 04.01.2010, 21:45    Titel: Antworten mit Zitat

Ist ganz und gar nicht schlecht! sogar sehr gut, denn so solls sein zwinkern

naja.. wäre der "macro-rahmen" in der include-datei nich... dann wärs absolut perfekt zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 04.01.2010, 23:44    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 956
Wohnort: Austria

BeitragVerfasst am: 04.01.2010, 23:46    Titel: Antworten mit Zitat

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


Code:
print "Hallo "; p1


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
Benutzer-Profile anzeigen Private Nachricht senden
OneCypher



Anmeldungsdatum: 23.09.2007
Beiträge: 802

BeitragVerfasst am: 05.01.2010, 00:16    Titel: Antworten mit Zitat

@St_W: Ja, ich glaub, das mit der konstante ist klasse grinsen .. 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
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz