dynamischer Aufruf von Modulen

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

dynamischer Aufruf von Modulen

Beitrag von SBond »

Hi Leute,

ich möchte ein Programm schreiben, dass gewisserweise modular aufgebaut wird. So soll das Hauptprogramm bestimmte Plugins verwalten.
Jedes Plugin ist in PureBasic ein Modul und besitzt eine bestimmte Struktur.

einfaches Beispiel:

...z.B. drei Plugins, die jeweils eine Prozedur beinhalten:

Plugin_A: Init()
Plugin_B: Init()
Plugin_C: Init()

Wenn das Hauptprogramm gestartet wird, sollen die Init()-Prozeduren aller Plugins aufgerufen werden.
Nun könnte ich beim Programmstart folgendes machen:

Code: Alles auswählen

Plugin_A::Init()
Plugin_B::Init()
Plugin_C::Init()
das würde auch funktionieren, aber kann man so etwas auch automatisieren? Kann man z.B. statt "Plugin_A" eine art Variable oder Platzhalter verwenden?

Code: Alles auswählen

aktuelles_Plugin$ = "Plugin_A"

aktuelles_Plugin$:Init()
...ich weiß nicht wie ich es lösen kann. Wie gehe ich an so etwas ran, wenn ich eine variable Zahl von Plugins habe, von dem jeweils nur der Modulname bekannt ist?


viele Grüße,
SBond
Zuletzt geändert von SBond am 07.02.2014 17:10, insgesamt 1-mal geändert.
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
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: dynamischer Aufruf von Modulen

Beitrag von NicTheQuick »

Das kannst du nicht machen, da Module schon während dem Kompilieren umgesetzt werden. In der EXE-Datei ist später nichts mehr von den Modulen zu sehen, also kannst du auch nicht zur Laufzeit bestimmten, was zu machen ist.

Du kannst aber Prototypen und Maps mit Funktionspointern nutzen:

Code: Alles auswählen

Prototype.i Prototype_Init()
Structure Plugin_Wrapper
	init.Prototype_Init
EndStructure
Global NewMap PluginMap.Plugin_Wrapper()

DeclareModule Plugin_A
	Declare.i Init()
EndDeclareModule
Module Plugin_A
	Procedure.i Init()
		Debug "Ich bin Plugin_A::Init()"
	EndProcedure
EndModule
PluginMap("Plugin_A")\init = Plugin_A::@Init()

DeclareModule Plugin_B
	Declare.i Init()
EndDeclareModule
Module Plugin_B
	Procedure.i Init()
		Debug "Ich bin Plugin_B::Init()"
	EndProcedure
EndModule
PluginMap("Plugin_B")\init = Plugin_B::@Init()


;Main
PluginMap("Plugin_A")\init()
PluginMap("Plugin_B")\init()
Leider lässt Purebasic wohl ein einfaches '@Plugin_B::Init()' nicht zu. Außerdem kann man Prototypes aus irgendeinem Grund auch nicht direkt als Typ für eine Map nutzen. Man muss das ganze in eine Structure kapseln. Wieder mal zwei Merkwürdigkeiten à la Fred. :roll:

Edit:
Es geht doch ohne UseModule, allerdings muss das @ eben nach die zwei Doppelpunkte. Danke Danilo.
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: dynamischer Aufruf von Modulen

Beitrag von SBond »

vielen Dank ;)

Habe mit Maps und Prototypes noch nicht gearbeitet, aber eventuell könnte es helfen.

danke dir erstmal :D
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
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: dynamischer Aufruf von Modulen

Beitrag von Danilo »

NicTheQuick hat geschrieben:Leider lässt Purebasic wohl ein einfaches '@Plugin_B::Init()' nicht zu.
Fred meinte das sieht schöner aus:

Code: Alles auswählen

Plugin_B::@Init()
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: dynamischer Aufruf von Modulen

Beitrag von helpy »

Schaut Euch doch mal das Framework PureWork von Hroudtwolf an.

lg,
guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: dynamischer Aufruf von Modulen

Beitrag von NicTheQuick »

Danilo hat geschrieben:Fred meinte das sieht schöner aus:

Code: Alles auswählen

Plugin_B::@Init()
:lol: Alles klar. Dann eben so. Merkwürdig sieht es dann aber trotzdem noch aus. :wink:
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: dynamischer Aufruf von Modulen

Beitrag von SBond »

super :D

dankeschön :D
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: dynamischer Aufruf von Modulen

Beitrag von ts-soft »

Ich denke mal, ich habe was übersehen, aber Module können sich doch selber Initialisieren.
Code ausserhalb von Proceduren wird doch einmalig automatisch ausgeführt, dort könnte
auch zum Beispiel eine Init() Funktion aufgerufen werden.
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
NicTheQuick
Ein Admin
Beiträge: 8837
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: dynamischer Aufruf von Modulen

Beitrag von NicTheQuick »

Ach, tatsächlich. Und ich dachte das passiert nur, wenn man UseModule nutzt. :doh:
Man kann dann nur immer noch nicht dynamisch ein Modul nach Namen "starten" oder nicht. Das legt dann der Quellcode fest.
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: dynamischer Aufruf von Modulen

Beitrag von ts-soft »

NicTheQuick hat geschrieben:Ach, tatsächlich. Und ich dachte das passiert nur, wenn man UseModule nutzt. :doh:

Code: Alles auswählen

DeclareModule test
  Declare GetBla()
EndDeclareModule

Module test
  Global bla.i = 100
  
  Procedure GetBla()
    ProcedureReturn bla
  EndProcedure
  
  Procedure Init()
    bla = 200
  EndProcedure
  
  Init()
EndModule

Debug test::GetBla()
NicTheQuick hat geschrieben:Man kann dann nur immer noch nicht dynamisch ein Modul nach Namen "starten" oder nicht. Das legt dann der Quellcode fest.
Wenn ich jetzt wüßte, was dynamisches Starten eines Modules sein soll? Module werden statisch gelinkt, sind also immer
vorhanden.

Gruß
Thomas
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
Antworten