Macro Variable auch als String nutzbar?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Macro Variable auch als String nutzbar?

Beitrag von Mijikai »

Ist es Möglich den Namen innerhalb des Macros irgendwie zusätzlich als String zu verwenden?

Code:

Code: Alles auswählen

EnableExplicit

Macro AddGlobal(a)
  Global.s a = a
  dummy() ;<- nur da um einen fehler zu erzeugen damit man sieht was im macro passiert
EndMacro

AddGlobal(Hallo)
Was das Macro tun soll:

Code: Alles auswählen

Global.s Hallo = "Hallo"
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Macro Variable auch als String nutzbar?

Beitrag von RSBasic »

Code: Alles auswählen

EnableExplicit

Macro DoubleQuote
  "
EndMacro

Macro AddGlobal(a)
  Global.s a = DoubleQuote#a#DoubleQuote
  ;dummy() ;<- nur da um einen fehler zu erzeugen damit man sieht was im macro passiert
EndMacro

AddGlobal(Hallo)

Debug Hallo
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Macro Variable auch als String nutzbar?

Beitrag von Mijikai »

Danke :allright:

Edit:

Funktioniert leider nicht im DeclareModule:

Code: Alles auswählen

DeclareModule TESTM
  
  Macro DoubleQuote
    "
  EndMacro
  
  Macro AddGlobal(a)
    Global.s a = DoubleQuote#a#DoubleQuote
    dummy() ;<- nur da um einen fehler zu erzeugen damit man sieht was im Macro passiert
  EndMacro
  
EndDeclareModule

Module TESTM
EndModule

TESTM::AddGlobal(Hallo)

Debug Hallo
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Macro Variable auch als String nutzbar?

Beitrag von RSBasic »

Scheint so, dass das Macro DoubleQuote außerhalb des Modules sein muss, damit es funktioniert.
Scheint ein Bug zu sein oder?
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Macro Variable auch als String nutzbar?

Beitrag von Mijikai »

RSBasic hat geschrieben:Scheint ein Bug zu sein oder?
Ich würde auch sagen das es ein Bug ist.

Leider sind meine Bug posts nicht gerne gesehen - hatte mal 2 die keine waren eingestellt
und wurde unfreundlich darauf hingewiesen.
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Macro Variable auch als String nutzbar?

Beitrag von mk-soft »

Ich denke das es kein Bug ist da das Macro DoubleQuote erst mit UseModule bekannt ist

Lösung...

Code: Alles auswählen

DeclareModule TESTM
  
  Macro DoubleQuote
    "
  EndMacro
  
  Macro AddGlobal(a)
    Global.s a = TESTM::DoubleQuote#a#TESTM::DoubleQuote
    ;dummy() ;<- nur da um einen fehler zu erzeugen damit man sieht was im Macro passiert
  EndMacro
  
EndDeclareModule

Module TESTM
EndModule

TESTM::AddGlobal(Hallo)

Debug Hallo
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: Macro Variable auch als String nutzbar?

Beitrag von Mijikai »

Danke @mk-soft :)
gut das ich noch keinen Bugreport gepostet habe. :doh:
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: Macro Variable auch als String nutzbar?

Beitrag von NicTheQuick »

Es mag vielleicht kein Bug sein, aber es ist wieder komplett anders wie es jede mir bekannte andere Programmiersprache macht, in denen Scopes richtig funktionieren. :wink:
Bild
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Macro Variable auch als String nutzbar?

Beitrag von Sicro »

Für mich ist es ebenfalls kein Bug.

Ich versuche es mal zu erklären.

Nehmen wir mal einen einfacheren Code:

Code: Alles auswählen

DeclareModule TestModule
  
  Macro TestMacro1
    Debug
  EndMacro
  
  Macro TestMacro2
    TestMacro1 "Test string"
  EndMacro
  
EndDeclareModule

Module TestModule
  
EndModule

TestModule::TestMacro2
Beim Kompilieren des obigen Codes ersetzt der Compiler diesen Code

Code: Alles auswählen

TestModule::TestMacro2
durch

Code: Alles auswählen

TestMacro1 "Test string"
Die Zeichenfolge "TestMacro1" kann nicht durch den Inhalt des Macros "TestMacro1" aufgelöst werden, weil das Macro nur innerhalb des Moduls existiert.

Schauen wir uns nun folgenden Code an:

Code: Alles auswählen

DeclareModule TestModule
 
  Macro TestMacro1
    Debug
  EndMacro
 
  Macro TestMacro2
    TestModule::TestMacro1 "Test string"
  EndMacro
 
EndDeclareModule

Module TestModule
 
EndModule

TestModule::TestMacro2
Hier wird der Code

Code: Alles auswählen

TestModule::TestMacro2
durch diesen ersetzt:

Code: Alles auswählen

TestModule::TestMacro1 "Test string"
Dieser Code funktioniert immer noch, weil wir auf das Macro "TestMacro1" im Modul "TestModule" verweisen. Der Compiler kann somit auch dieses Macro auflösen und wir erhalten diesen Code:

Code: Alles auswählen

Debug "Test string"
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Macro Variable auch als String nutzbar?

Beitrag von Josh »

Die erklärung von Sicro erscheint schlüssig, also würde ich es auch nicht als Bug bezeichnen. Intuitiv hätte ich aber gesagt, dass jedes Macro sofort aufgelöst wird, wobei dann:

Code: Alles auswählen

DeclareModule TestModule
  
  Macro TestMacro1
    Debug
  EndMacro
  
  Macro TestMacro2
    TestMacro1 "Test string"
  EndMacro
  
EndDeclareModule

Module TestModule
  
EndModule

TestModule::TestMacro2
im 'ersten Schritt' ersetzt wird durch:

Code: Alles auswählen

DeclareModule TestModule
  
  Macro TestMacro2
    Debug "Test string"
  EndMacro
  
EndDeclareModule

Module TestModule
  
EndModule

TestModule::TestMacro2
Antworten