dynamischer Aufruf von Modulen

Für allgemeine Fragen zur Programmierung mit PureBasic.
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 »

ts-soft hat geschrieben:
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
...
War nicht nötig. Hab's ja schon bestätigt.
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.
Ja, ich weiß das auch nicht so genau. Ich habe das vom Threadstarter eben so verstanden, dass er gerne Module fast wie DLLs dynamisch laden und entladen kann. Ich denke er möchte sowas ähnliches machen wie es mit OOP möglich wäre. Man hat eine abstrakte Klasse "Plugin" und dann mehrere Klassen "Plugin1" bis "PluginX", die von dieser erben und sie erweitern. Dann kann man dynamisch Objekte von einem beliebigen Plugin erstellen, sie aber dem Typ "Plugin" zuordnen.
Aber stimmt schon. Module sind dafür eben nur begrenzt nutzbar, weil sie eben statisch sind.
Ich hab trotzdem versucht SBond irgendwie eine Möglichkeit für seinen Ansatz zu geben. Möglicherweise muss er aber auch nochmal komplett umdenken bei dem, was er vorhat.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: dynamischer Aufruf von Modulen

Beitrag von helpy »

Hier mal ein Code zum Testen:

Code: Alles auswählen

EnableExplicit


DeclareModule modTools
  EnableExplicit
  
  Declare AddInitProcedure( *InitProcedure, ModuleName.s )
  Declare CallInitProcedures()
  
  Macro SetInitProcedure()
    If Defined( Init, #PB_Procedure )
      modTools::AddInitProcedure( @Init(), #PB_Compiler_Module )
    EndIf
  EndMacro
EndDeclareModule

Module modTools
  Prototype pInitProcedure()
  Structure tInitProcedure
    ModuleName.s
    *InitProcedure.pInitProcedure
  EndStructure
  
  Global NewList InitProcedures.tInitProcedure()
  
  Procedure AddInitProcedure( *InitProcedure, ModuleName.s )
    If *InitProcedure
      LastElement( InitProcedures() )
      AddElement( InitProcedures() )
      With InitProcedures()
        \InitProcedure = *InitProcedure
        \ModuleName = ModuleName
      EndWith
    EndIf
  EndProcedure
  
  Procedure CallInitProcedures()
    Protected result
    ForEach  InitProcedures()
      Debug "Call InitProcedure in module " + InitProcedures()\ModuleName
      result = InitProcedures()\InitProcedure()
      Debug "  --> Result: " + Str(result)
    Next
  EndProcedure
EndModule


DeclareModule  mod1
  EnableExplicit
EndDeclareModule

Module mod1
  Procedure Init()
    Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
    ProcedureReturn 10
  EndProcedure
  modTools::SetInitProcedure()
EndModule


DeclareModule  mod2
  EnableExplicit
EndDeclareModule

Module mod2
  Procedure Init()
    Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
    ProcedureReturn 20
  EndProcedure
  modTools::SetInitProcedure()
EndModule


DeclareModule  mod3
  EnableExplicit
EndDeclareModule

Module mod3
  Procedure Init()
    Debug "Start of " + #PB_Compiler_Module + "::" + #PB_Compiler_Procedure
    ProcedureReturn 30
  EndProcedure
  modTools::SetInitProcedure()
EndModule


modTools::CallInitProcedures()
Windows 10
PB Last Final / (Sometimes testing Beta versions)
SBond
Beiträge: 266
Registriert: 22.05.2013 20:35

Re: dynamischer Aufruf von Modulen

Beitrag von SBond »

...da wird ja doch recht komplex.

Hintergrund für mein Beispiel mit den Plugins, ist die eigentlich der Wunsch nach Quellcode-Optimierung :D
Ich stehe immer wieder vor dem Problem größere Projekte sauber zu strukturieren. Die Module habe ich erst vor kurzem bewusst wahr genommen.
Sie bieten eine gute Möglichkeit Prozeduren und Variablen zu kapseln. Daher kam mir der Gedanke, ob man das auch dynamisch umsetzen kann.
NicTheQuick hat schon richtig erkannt, wie ich es gemeint habe :).

...aber eventuell ist das ja wirklich zu weit hergeholt, als dass es einen praktischen Sinn erfüllt.
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 »

Bei Modulen gilt das Motto: Ganz oder garnicht :mrgreen:
Das einzig geeignete wären UserLibraries, solange Du diese selbst erstelltst, sollten die ja auch kein
Problem darstellen.

UserLibraries werden nur hinzugelinkt, wenn verwendet und dann auch nur die erforderlichen Funktionen.
Die anderen Vorteile der Module wie Kapselung usw. stehen Dir dann auch zur Verfügung.

Einen anderen Weg sehe ich zur Zeit nicht.

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