Zugriff auf Main von innerhalb eines Moduls

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von #NULL »

Sicro hat geschrieben:

Code: Alles auswählen

...
  Macro OptionsMacro
...
Schöne Idee. So eine Art Mixin.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

mhs hat geschrieben: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.
Das ist mal eine stichfeste Erklärung für das aktuelle Verhalten. :allright:
Okay, jetzt macht es Sinn, wenn die Konstanten des Mainscopes ausgeblendet werden.

Die Sache mit der Konstantendefinition per Macro werde ich so machen, auch das ist sehr sinnvoll.

Gruß Markus
"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 2023: 56 Jahre.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

Tja, schade. Das mit dem Macro funktioniert leider nicht, wenn ich es mittels Includedatei realiseren möchte.

Moduldatei:
----

Code: Alles auswählen

DeclareModule MyModule
	Macro CommonConstants()
		Enumeration
			#GG_DATAMODE_INTEGER
			#GG_DATAMODE_FLOAT
		EndEnumeration
	EndMacro
	
	CommonConstants()
  ; ...
	
EndDeclareModule

Module MyModule
	; ...	
EndModule

MyModule::CommonConstants()
Man beachte: Ich lasse innerhalb der separaten Moduldatei das Macro ganz am Ende bereits im Hauptscope ausführen, damit man als Anwender des Moduls nicht extra daran denken muss. Aber leider werden die Konstanten im Hauptscope nicht vorgeschlagen.

Angenommen das Hauptprogramm sieht einfach nur so aus

Code: Alles auswählen

IncludeFile "MyModule.pbi"
; ...
... dann müssten die Konstanten direkt hinter dem Includefile ja schon verfügbar sein.

Wenn ich nun im Editor versuche die Konstanten zu nutzen, tut sich nix. Offenbar parst der Editor nicht Includefileübergreifend bzw. expandiert er die Macros nicht.

Ich bleibe also bei der doppelten Deklaration und passe auf, dass ich bei Änderungen immer schön mit Copy & Pastete arbeite. :)
"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 2023: 56 Jahre.
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:... dann müssten die Konstanten direkt hinter dem Includefile ja schon verfügbar sein.
Für den Compiler sind sie auch verfügbar. Nur der Editor (Autovervollständigung) kennt nicht den Inhalt von Include-Dateien.

Mein Hauptprogramm:

Code: Alles auswählen

IncludeFile "MyModule.pbi"

Debug #GG_DATAMODE_INTEGER
Debug #GG_DATAMODE_FLOAT
Wie erwartet wird
0
1
angezeigt.
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von silbersurfer »

@Nino
Für den Compiler sind sie auch verfügbar. Nur der Editor (Autovervollständigung) kennt nicht den Inhalt von Include-Dateien.
doch wenn die Include-Dateinen einfach in den Editor hinzugeladen werden (in einen neuen Tab), dann werden Sie auch von der Autovervollständigung gefunden, sofern in der Einstellung unter Autovervollständigung alle offene Projekte makiert ist.
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Nino »

silbersurfer hat geschrieben:doch wenn die Include-Dateinen einfach in den Editor hinzugeladen werden (in einen neuen Tab), dann werden Sie auch von der Autovervollständigung gefunden, sofern in der Einstellung unter Autovervollständigung alle offene Projekte makiert ist.
Mag sein. Das wird hier aber nicht viel nützen, da Makros sowieso nur vom Compiler expandiert werden. :-)
Benutzeravatar
silbersurfer
Beiträge: 174
Registriert: 06.07.2014 12:21

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von silbersurfer »

@Nino
Mag sein. Das wird hier aber nicht viel nützen, da Makros sowieso nur vom Compiler expandiert werden.
das weiß ich jetzt nicht so genau, aber es sind auch Makros in der Option dort auswählbar.
Bild
Intel Quad Core 3,2 Ghz - GTX 1060 - BlitzBasic Plus 1.48 , PureBasic 5.70 LTS / Aktuelles Projekt PureCommander
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

Ich kann es jetzt nicht ausprobieren, aber ich denke, dass das nur bedeutet, dass die Autovervollständigung auch Macrobezeichner auflisten soll.

Die IDE wird Macros vermutlich nicht auflösen, um deren Inhalt bzgl. Verwendbarkeit in der Autovervollständigung zu untersuchen.
"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 2023: 56 Jahre.
Benutzeravatar
Sicro
Beiträge: 955
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Sicro »

@Kurzer:
Ja, Autovervollständigung funktioniert mit der Macro-Variante leider nicht, weil die Macros erst beim Kompilieren aufgelöst werden.

Nimm die Variante von @mk-soft, die speziell ein Modul für die Konstanten bereitstellt und mit UseModule überall "inkludiert" werden kann, wo du Zugriff auf die Konstanten haben möchtest. So gelöst funktioniert auch die Autovervollständigung.
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
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Zugriff auf Main von innerhalb eines Moduls

Beitrag von Kurzer »

Nochmal zur Erinnerung... :|
kurzer hat geschrieben:Die beiden #GG_DATAMODE... Konstanten habe ich in den Hauptscope gelegt, damit ich 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.
Natürlich hätte ich das alles mit UseModule oder durch Verwendung eines unabhängigen "CommonConstants-Moduls" machen können, aber darum ging es mir nicht. Meine zugrunde liegende Anforderung war eine andere.

Es ging darum, das Modul vom Hauptscope aus explizit zu adressieren ModulName::ModuleFunction(*Blah, #GG_DATAMODE_XYZ) (ohne Verwendung von UseModul) und dabei den Konstantennamen direkt anwenden zu können.

Es sind mittlerweile viele nette Vorschläge erwähnt worden. Für meinen Fall relevant und nutzbar bleibt jedoch nur die manuelle, doppelte Deklaration der Konstanten (ohne Macro) und der Hinweis von mhs, der die Abschottung der selbst definierten Konstanten aus dem Mainscope gegenüber dem Modulscope für mich schlüssig begründet hat.
"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 2023: 56 Jahre.
Antworten