Module: Defaultparameter mit privater Konstante realisieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Module: Defaultparameter mit privater Konstante realisieren

Beitrag von Kurzer »

Irgendwie ist es nicht möglich in einem Modul einen Defaultparameter einer Prozedur mit einer Konstante zu belegen und die Konstante gleichzeitig als privat zu deklarieren.

Man muss man die Konstante in jedem Fall im Bereich "DeclareModul" deklarieren (sie ist dann nach außen hin sichtbar), andernfalls meckert der Compiler, dass die Prozedur nicht mit der Deklaration übereinstimmt.

Erreichen möchte ich, dass die Konstante #MY_DEFAULT auch im Bereich zwischen UseModule und UnUseModule unten im Hauptcode nicht sichtbar ist. Trotzdem soll diese Konstante als Defaultparameter für die Prozedur MyProc() dienen.

Wie kriegt man das hin?

Code: Alles auswählen

DeclareModule Test
	; Erst wenn man die folgende Zeile auskommentiert, ist die Konstante #MY_DEFAULT wirklich privat,
	; aber dann meckert der Compiler natürlich, dass er die Konstante für die Proceduredeklaration nicht kennt.
	#MY_DEFAULT = $fffff    ; <- auskommentieren
	Declare MyProc(x.i,y.i,color.i=#MY_DEFAULT) ; <- auskommentieren
	
	; Versucht man es dann mit so einem Dummy, dann meckert der Compiler, dass Prozedur und Prozedurdeklaration nicht übereinstimmen
	; Wie kann ich es realisieren, dass ich eine Konstante als Defaultparameter nutzen kann, diese aber privat ist?
	; Declare MyProc(x.i,y.i,color.i=0)   ; <- einkommentieren
	
EndDeclareModule

Module Test
	#MY_DEFAULT = $fffff
	Procedure MyProc(x.i,y.i,color.i=#MY_DEFAULT)
		;...
	EndProcedure
EndModule

UseModule Test

; Zum prüfen, ob die Konstante wirklich komplett privat ist, hier einfach mal "#MY_" tippen
; Wenn die Autovervollständigung nicht anspringt, dann ist die Konstante privat.

UnuseModule Test
"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
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von mk-soft »

Für solche fälle nimm doch PB-Konstanten. Mach ich auch...

Code: Alles auswählen

DeclareModule Test
   ; Erst wenn man die folgende Zeile auskommentiert, ist die Konstante #MY_DEFAULT wirklich privat,
   ; aber dann meckert der Compiler natürlich, dass er die Konstante für die Proceduredeklaration nicht kennt.
   ;#MY_DEFAULT = $fffff    ; <- auskommentieren
   Declare MyProc(x.i,y.i,color.i=#PB_Default) ; <- auskommentieren
   
   ; Versucht man es dann mit so einem Dummy, dann meckert der Compiler, dass Prozedur und Prozedurdeklaration nicht übereinstimmen
   ; Wie kann ich es realisieren, dass ich eine Konstante als Defaultparameter nutzen kann, diese aber privat ist?
   ; Declare MyProc(x.i,y.i,color.i=0)   ; <- einkommentieren
   
EndDeclareModule

Module Test
   #MY_DEFAULT = #PB_Default
   Procedure MyProc(x.i,y.i,color.i=#PB_Default)
      ;...
   EndProcedure
EndModule

UseModule Test

; Zum prüfen, ob die Konstante wirklich komplett privat ist, hier einfach mal "#MY_" tippen
; Wenn die Autovervollständigung nicht anspringt, dann ist die Konstante privat.

UnuseModule Test

Debug #PB_Default
Debug #PB_Ignore
Debug #PB_Any
Debug #PB_All
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Bisonte
Beiträge: 2427
Registriert: 01.04.2007 20:18

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von Bisonte »

Eigentlich gar nicht.
Er kann ja nicht nutzen, was er nicht kennt. Ich würde das mit einer zusätzlichen
Prozedur und einer Globalen Variablen machen, falls der User den Defaultwert selbst bestimmen können soll:

Code: Alles auswählen

DeclareModule Test
   Declare SetColorDefault(Value)
   Declare MyProc(x.i,y.i,color.i=#PB_Default) ; #PB_Default = -1   
EndDeclareModule

Module Test
  
  Global ColorDefault = #Black
  
  Procedure SetColorDefault(Value)
    ColorDefault = Value  
  EndProcedure
      
  Procedure MyProc(x.i,y.i,color.i=#PB_Default)
    If Color = #PB_Default
      Coolor = ColorDefault
    EndIf
    ; ...
  EndProcedure
EndModule
Aber eine "Public" Prozedur mit einer "Private" Konstanten geht definitiv nicht.
PureBasic 6.04 LTS (Windows x86/x64) | Windows10 Pro x64 | Asus TUF X570 Gaming Plus | R9 5900X | 64GB RAM | GeForce RTX 3080 TI iChill X4 | HAF XF Evo | build by vannicom​​
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von mk-soft »

Gute Idee :wink:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von Nino »

Kurzer hat geschrieben:Irgendwie ist es nicht möglich in einem Modul einen Defaultparameter einer Prozedur mit einer Konstante zu belegen und die Konstante gleichzeitig als privat zu deklarieren.

Man muss man die Konstante in jedem Fall im Bereich "DeclareModul" deklarieren (sie ist dann nach außen hin sichtbar), andernfalls meckert der Compiler, dass die Prozedur nicht mit der Deklaration übereinstimmt.
Du sprichst hier natürlich von benannten Konstanten. Damit geht das was Du beschreibst nicht. Es geht allerdings, wenn Du innerhalb von DeclareModule literale Konstanten verwendest.
Kurzer hat geschrieben:

Code: Alles auswählen

DeclareModule Test
	
	; Versucht man es dann mit so einem Dummy, dann meckert der Compiler, dass Prozedur und Prozedurdeklaration nicht übereinstimmen
	; Declare MyProc(x.i,y.i,color.i=0)   ; <- einkommentieren

EndDeclareModule
Nein, irgendein Dummy funktioniert nicht. Die in DeclareModule verwendete literale Konstante muss schon den selben Wert haben wie die im privaten Module-Teil verwendete benannte Konstante. ;-) So geht's (getestet mit PB 5.70 LTS):

Code: Alles auswählen

DeclareModule Test
   Declare MyProc(x.i, y.i, color.i=$ABCDEF)
EndDeclareModule


Module Test
   #MY_DEFAULT = $ABCDEF    ; Diese benannte Konstante ist privat.
   
   Procedure MyProc(x.i, y.i, color.i=#MY_DEFAULT)
      Debug Hex(color)
   EndProcedure
EndModule


; Debug Test::#MY_DEFAULT   ; würde eine Fehlermeldung verursachen

Test::MyProc(100, 100)
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von Kurzer »

wieder was gelernt.
vielen dank für eure kommentare. [THUMBS UP SIGN]

ich werde die benannten konstanten öffentlich lassen, das ist am flexibelsten.

gruss kurzer
"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
STARGÅTE
Kommando SG1
Beiträge: 6996
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von STARGÅTE »

Wieso sollte denn eine Konstante Privat bleiben?
Ich kann doch mit der Konstanten kein Unfug treiben.
Wenn diese Konstante in einer Prozedure als Voreinstellung genutzt wird, dann möchte der Nutzer diese Voreinstellung doch ggf. selbst auch nutzen. Vorallem genau dann, wenn es möglicherweise mehrere optionale Parameter gibt und ich den mittleren "überspringen" möchte, brauche ich genau diese Konstante.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
Kurzer
Beiträge: 1614
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Module: Defaultparameter mit privater Konstante realisie

Beitrag von Kurzer »

Eigentlich wollte ich nur wissen, ob dieser Grad an Kapselung in einem Modul möglich ist.
Es ist in der Tat in der Praxis nicht tragisch, wenn die Konstanten sichtbar sind.

Aber manchmal gehen mir solche Sachen durch den Kopf und ich beschäftige mich dann intensiver damit (wehalb ich mit den wirklich wichtigen Dingen meist nur schleppend voran komme :wink:. Aber Einsicht ist der erste Weg zur Besserung :lol:).
"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: Module: Defaultparameter mit privater Konstante realisie

Beitrag von Nino »

STARGÅTE hat geschrieben:Wieso sollte denn eine Konstante Privat bleiben?
Ich hatte auch schon so eine Situation. Der Code ist sicher noch irgendwo auf meiner Festplatte, ich habe jetzt aber keine Lust ihn zu suchen. :-)
Es kommt auf den Einzelfall an. Es kann sein, dass der Nutzer eines Moduls die betr. Konstanten eben nicht braucht. Wenn sie aber als Public deklariert sind, denkt er evtl., dass er sie irgendwie brauchen könnte. Das Modul wird dadurch unübersichtlicher, v.a. für dessen Nutzer.
Antworten