Prozeduraufruf im Modul über Makros

Für allgemeine Fragen zur Programmierung mit PureBasic.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Prozeduraufruf im Modul über Makros

Beitrag von SBond »

Hallo Leute,

ich mal wieder einen kleines Problem. Ist es möglich eine Prozedur (innerhalb eines Moduls) über ein Makro aufzurufen, ohne UseModule / UnuseModule zu verwenden?

Folgendes Beispiel:

Code: Alles auswählen

DeclareModule TestMod
	Declare.s Init()
EndDeclareModule

Module TestMod
	Procedure.s Init()
		ProcedureReturn "Init OK"
	EndProcedure
EndModule


; dieses funktioniert:
Macro Modul_Init_1(ModName)
	UseModule ModName
	Debug Init()
	UnuseModule ModName
EndMacro


; dieses funktioniert nicht:
Macro Modul_Init_2(ModName)
	Debug ModName::Init()
EndMacro


; Testen:
Modul_Init_1(TestMod)
Modul_Init_2(TestMod) ; gibt einen Fehler
Ich möchte UseModule / UnuseModule vermeiden, da es unter umständen zu Namenskonflikten kommen könnte. Es ist zwar unwahrscheinlich, aber nicht ausgeschlossen.

viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Prozeduraufruf im Modul über Makros

Beitrag von RSBasic »

Code: Alles auswählen

DeclareModule TestMod
   Declare.s Init()
EndDeclareModule

Module TestMod
   Procedure.s Init()
      ProcedureReturn "Init OK"
   EndProcedure
EndModule


; dieses funktioniert:
Macro Modul_Init_1(ModName)
   UseModule ModName
   Debug Init()
   UnuseModule ModName
EndMacro


; dieses funktioniert nicht:
Macro Modul_Init_2(ModName)
   Debug ModName#::Init()
EndMacro


; Testen:
Modul_Init_1(TestMod)
Modul_Init_2(TestMod) ; gibt keinen Fehler mehr ;)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Prozeduraufruf im Modul über Makros

Beitrag von Bisonte »

Code: Alles auswählen

Macro Modul_Init_2(ModName)
   Debug ModName#::Init()
EndMacro
Durch rumprobieren erraten ;)

Mist : RSBasic war 9 Sekunden schneller mit posten :lol:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Prozeduraufruf im Modul über Makros

Beitrag von SBond »

...oh nein... das steht sogar in der PB-Hilfe :oops:
Mit der Verwendung von Parametern ist es möglich, sehr flexible Makros zu erschaffen. Das spezielle Verknüpfungszeichen '#' kann benutzt werden, um neue Labels oder Keywords (Schlüsselwörter) durch Mischen von Makro-Code und Parameter-Ausdrücken zu erschaffen (Leerzeichen zwischen jedem Wort werden durch das Verknüpfungszeichen nicht akzeptiert). Es ist auch möglich, Standardwerte für Parameter zu definieren, sodass sie beim Aufruf des Makros weggelassen werden können.
Ich habe mich schon gewundert, warum ab und zu ein '#' auftaucht. Das erklärt jetzt einiges. Vielen Dank euch beiden. Ich hätte besser lesen sollen. <)

viele Grüße,
SBond
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Prozeduraufruf im Modul über Makros

Beitrag von ts-soft »

Wenn es um die Initialsierung geht, die Erfolgt automatisch bei erstmaliger Nutzung des Moduls:

Code: Alles auswählen

DeclareModule TestMod
  Declare.s Init()
EndDeclareModule

Module TestMod
  Procedure.s Init()
    ProcedureReturn "Init OK"
  EndProcedure
  
  Init()
EndModule
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Bisonte
Beiträge: 2476
Registriert: 01.04.2007 20:18

Re: Prozeduraufruf im Modul über Makros

Beitrag von Bisonte »

Funktioniert doch eigentlich in folgendem Szenario nicht, oder ?

Code: Alles auswählen

; Declare Sektion
DeclareModule TestMod
  Declare.s Init()
EndDeclareModule

; Mega Supertoller Sourcecode

End 

; Prozeduren und Module... 
Module TestMod
  Procedure.s Init()
    ProcedureReturn "Init OK"
  EndProcedure
 
  Init()
EndModule
Sondern nur wenn die Abteilung zwischen "Module" und "EndModule" vor dem supertollen SourceCode stehen würde... sehe ich das richtig ?
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Prozeduraufruf im Modul über Makros

Beitrag von ts-soft »

Warum probierste es nicht aus?
Nein, funktioniert nicht.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: Prozeduraufruf im Modul über Makros

Beitrag von SBond »

ts-soft hat geschrieben:Wenn es um die Initialsierung geht, die Erfolgt automatisch bei erstmaliger Nutzung des Moduls
Jep. Das ist schon richtig so, aber ich habe es bewusst nicht so gemacht. Der Grund ist folgender: Ich nutze das Makro dahingehend, dass es Module (sind bei mir in einzelnen Dateien) inkludiert. Anschließend wird im jeweiligen Modul eine Prozedur aufgerufen, die Informationen über das Modul zurückgibt (Name, Version, Beschreibung,...).

Ein automatischer Aufruf dieser Prozedur wie in deinem Beispiel würde nicht gehen, da die Prozedur die Informationen ins leere schicken würde. ...oder ich müsste im Modul die Information hinterlegen, wo die Daten hin sollen. ...wäre aber nicht so toll <)

...habe im ersten Post aber bewusst diese Bedingungen weggelassen, um nicht von er Problemstellung abzulenken :)
41 6c 73 6f 20 77 65 6e 6e 20 64 75 20 73 6f 20 76 69 65 6c 20 4c 61 6e 67 65 77 65 69 6c 65 20 68 61 73 74 2c 20 64 61 6e 6e 20 6b 61 6e 6e 73 74 20 64 75 20 61 75 63 68 20 67 6c 65 69 63 68 20 7a 75 20 6d 69 72 20 6b 6f 6d 6d 65 6e 20 75 6e 64 20 61 62 77 61 73 63 68 65 6e 2e

:D
Antworten