Zugriff auf Main von innerhalb eines Moduls

Anfängerfragen zum Programmieren mit PureBasic.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Nino »

Kurzer hat geschrieben:Sorry, wenn ich das hier ausbuddel, aber ich habe mich gerade ähnliches gefragt ("warum kann ich im Modul nicht auf Konstanten des Hauptprogramms zugreifen?"), zumal bei WIN-Api Konstanten offenbar eine Ausnahme gemacht wird.
Ich denke nicht, dass es eine Ausnahme speziell für WinAPI Konstanten gibt.
Sondern die Regel scheint mir zu sein, dass man innerhalb eines Moduls auf alle Bezeichner zugreifen kann, deren Definition PB selbst mitbringt. Das gilt für viele WinAPI-Konstanten, aber auch für diejenigen die mit #PB_ anfangen und auch für alle in PB eingebauten Funktionen. Und das ist gut so. :-) Abgeschottet werden sollen offenbar nur die von Dir oder mir selbst definierten Bezeichner. Ich finde das durchaus logisch.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

Das ist sicherlich eine Ansichtssache und man kann vermutlich genau so wenig drüber streiten wie über verschiedene Geschmäcker.

Ich ging davon aus, dass Module von Fred ins Leben gerufen worden sind, um deren Code zu kapseln, so dass durch den Modulecode keine Seiteneffekte oder Namenskollisionen im Zusammenhang mit dem Hauptcode entstehen.
Wenn ein Modul Konstanten des Hauptcodes nutzt sehe ich diese Gefahr nicht. Aber evtl. war es für Fred leichter zu implementieren, wenn man alle Elemente des Hauptcodes ausblendet. Who knows? :)

Mit der doppelten Definition der Konstanten komme ich jetzt aber prima zurecht.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von NeoChris »

Da sind wir wieder beim gleichen Thema, dass das alles total logisch ist, so Meinung von Nino und GPI. :lol:
Natürlich haben alle anderen das Konzept Module einfach nicht verstanden. xD
Man sieht hier wieder ganz deutlich dass die Implementierung von Module einfach noch nicht ausgereift ist und nicht gerade durchdacht wurde...
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Nino »

Kurzer hat geschrieben:Mit der doppelten Definition der Konstanten komme ich jetzt aber prima zurecht.
Du kannst auch die betr. Konstanten in eine Include-Datei schreiben, und diese Datei dann 2x "includieren": Einmal innerhalb des Moduls und einmal außerhalb. Habe ich nicht getestet, sollte aber gehen.
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Nino »

NeoChris hat geschrieben:Da sind wir wieder beim gleichen Thema, dass das alles total logisch ist, so Meinung von Nino und GPI. :lol:
Wer lesen kann der wird bemerkt haben, dass ich von "alles" nie geschrieben habe. Aber manche wollen hier halt nur polemisieren.
NeoChris hat geschrieben:Natürlich haben alle anderen das Konzept Module einfach nicht verstanden. xD
Und du bist der Sprecher für "alle anderen"? :lol:
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Sicro »

Kurzer hat geschrieben:Mit der doppelten Definition der Konstanten komme ich jetzt aber prima zurecht.
Was hältst du davon:

Code: Alles auswählen

DeclareModule Test
  Macro OptionsMacro
    Enumeration Options
      #Option_1
      #Option_2
      #Option_3
    EndEnumeration
  EndMacro
EndDeclareModule

Module Test
  OptionsMacro
  Debug #Option_3
EndModule

Test::OptionsMacro
Debug #Option_2
Am besten finde ich in dem Fall jedoch, wenn der Haupt-Code ebenfalls in einem Modul gekapselt ist.
Zuletzt geändert von Sicro am 20.02.2019 19:39, insgesamt 1-mal geändert.
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
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von mk-soft »

Warum zwei mal deklarieren?

Code: Alles auswählen

;-TOP

DeclareModule Public
  
  Enumeration 1
    #My_Option_1
    #My_Option_2
    #My_Option_3
    #My_Option_4
  EndEnumeration
  
EndDeclareModule

Module Public
  ;
EndModule

; ----

DeclareModule MyModule
  Declare Show()
EndDeclareModule

Module MyModule
  
  UseModule Public
  
  Procedure Show()
    Debug #PB_Compiler_Module + " / Option 1 = " + #My_Option_1
    Debug #PB_Compiler_Module + " / Option 2 = " + #My_Option_2
    Debug #PB_Compiler_Module + " / Option 3 = " + #My_Option_3
    Debug #PB_Compiler_Module + " / Option 4 = " + #My_Option_4
  EndProcedure
  
EndModule

; ----

UseModule Public

Debug "Option 1 = " + #My_Option_1
Debug "Option 2 = " + #My_Option_2
Debug "Option 3 = " + #My_Option_3
Debug "Option 4 = " + #My_Option_4

Debug "----"
MyModule::Show()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
helpy
Beiträge: 635
Registriert: 29.08.2004 13:29

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von helpy »

_JON_ hat geschrieben:
Kurzer hat geschrieben:PS: Ich löse das jetzt damit, dass ich die betreffenden Konstanten zweimal deklariere. Innerhalb und außerhalb des Moduls. :freak:
Ja, anders geht es auch nicht.
Ihr wisst schon, dass das doch auch anders geht ;-)

Alle Konstanten, die für andere Module verfügbar sein sollen in einem eigenen Modul deklarieren:

Code: Alles auswählen

DeclareModule CONSTANTS
	Enumeration
		#GG_DATAMODE_INTEGER
		#GG_DATAMODE_FLOAT
	EndEnumeration
EndDeclareModule
Module CONSTANTS : EndModule
Diese Konstanten können dann in anderen Modulen dann auch wiederverwendet werden, entweder mit UseModule oder mit dem Modul-Präfix:

Code: Alles auswählen

DeclareModule TEST1
	UseModule CONSTANTS
	Declare Test()
EndDeclareModule
Module TEST1
	Procedure Test()
		Debug #GG_DATAMODE_INTEGER
		Debug #GG_DATAMODE_FLOAT
	EndProcedure
EndModule

DeclareModule TEST2
	Declare Test()
EndDeclareModule
Module TEST2
	Procedure Test()
		Debug CONSTANTS::#GG_DATAMODE_INTEGER
		Debug CONSTANTS::#GG_DATAMODE_FLOAT
	EndProcedure
EndModule
Ich schreibe grundsätzlich keinen Code mehr im globalen Scope und verwende für die Hauptanwendung "Module Application..." :-)

Code: Alles auswählen

DeclareModule Application
	EnableExplicit
EndDeclareModule
Module Application
	Procedure MAIN()
		TEST1::Test()
		TEST2::Test()
	EndProcedure
	End MAIN()
EndModule
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

Ich deklariere die Konstanten in meiner ModuleDatei zweimal (einmal außerhalb und einmal innerhalb des Modulscopes), weil ich...
kurzer hat geschrieben:... bei Nutzung des Moduls ohne UseModule einfach...

GraphGadget::Draw(*GHnd, #GG_DATAMODE_INTEGER) schreiben kann und nicht die umständliche Variante
GraphGadget::Draw(*GHnd, GraphGadget::#GG_DATAMODE_INTEGER), wenn ich die beiden Konstanten innerhalb des Moduls deklarieren würde.
Es ging in dem Fall darum die Konstanten ohne vorheriges UseModule() bei Verwendung der expliziten Adressierung des Moduls (ModuleName::) mit dem reinen Konstantennamen verwenden zu können.

Aber trotzdem gut hier so viel andere Vorschläge versammelt zu sehen. Danke.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
mhs
Beiträge: 224
Registriert: 11.01.2009 16:30
Wohnort: Graben
Kontaktdaten:

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von mhs »

Kurzer hat geschrieben:Ich deklariere die Konstanten in meiner ModuleDatei zweimal (einmal außerhalb und einmal innerhalb des Modulscopes), weil ich...
kurzer hat geschrieben:... bei Nutzung des Moduls ohne UseModule einfach...

GraphGadget::Draw(*GHnd, #GG_DATAMODE_INTEGER) schreiben kann und nicht die umständliche Variante
GraphGadget::Draw(*GHnd, GraphGadget::#GG_DATAMODE_INTEGER), wenn ich die beiden Konstanten innerhalb des Moduls deklarieren würde.
Es ging in dem Fall darum die Konstanten ohne vorheriges UseModule() bei Verwendung der expliziten Adressierung des Moduls (ModuleName::) mit dem reinen Konstantennamen verwenden zu können.

Aber trotzdem gut hier so viel andere Vorschläge versammelt zu sehen. Danke.
Allerdings immer mit der Gefahr, dass du irgendwo einen Fehler machst und die gleiche Konstante mit zwei unterschiedlichen Werten belegst.

Das kann so ziemlich der Worst-Case sein, da solche Fehler oft während der Entwicklung nicht sofort auffallen und erst nach Wochen, Monaten oder gar Jahren zum Vorschein kommen und man dann erkennen muss, dass alle bisherigen Berechnungen, Datensätze, o.ä. falsch sind.

PB kapselt die Konstanten des Main Scopes ebenfalls, da es auch hier zu Überschneidungen kommen könnte. Das ist eigentlich sogar ziemlich gut durchdacht. Gehe davon aus, dass aus irgendwelchen Gründen im Main Scope bereits #GG_DATAMODE_INTEGER deklariert ist, was passiert dann innerhalb des Moduls, wenn die gleiche Konstante nochmal deklariert wird? Das ist in dem Fall zwar unwahrscheinlich, die Konstante könnte aber auch einfach #ALL, #NONE, etc heißen. Ich persönlich arbeite immer mit dem Modulscope ohne zusätzliche Abkürzungen, z.B. GraphGadget::#DATAMODE_INTEGER und habe immer ein "Main" Modul. So bin ich es auch aus anderen Programmiersprachen gewohnt.

Vielleicht solltest du nochmal den Vorschlag von Sicro mit dem Macro anschauen. Den finde ich für deine Vorgehensweise recht sinnig, da du weiterhin die Konstanten zweimal deklariert hast, aber nur einmal im Code pfllegen musst und dadurch etwaige Fehler vermeidest:

Code: Alles auswählen

; Modul Datei
; -----------
DeclareModule Test

  Macro OptionsMacro
    Enumeration Options
      #Option_1
      #Option_2
      #Option_3
    EndEnumeration
  EndMacro
  
  OptionsMacro
  
EndDeclareModule

Module Test  
  Debug #Option_3
EndModule

Test::OptionsMacro
; -----------


; Main Datei
; ----------
; Include Modul Datei
Debug #Option_2
; ----------
Michael Hack

Michael Hack Software :: Softwareentwicklung | Webentwicklung | IT-Dienstleistungen
www.michaelhacksoftware.de :: www.mh-s.de :: www.michael-hack.de
Antworten