Protected...Private... Variable schützen
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Protected...Private... Variable schützen
Hi Leutz,
es geht darum, ich möchte ein paar Prozeduren schreiben die alle auf die selbe Variable bzw. LinkedList zugreifen.
Ich hätte es gern so, die verschiedenen Prozeduren sollen darauf zugreifen können allerdings möchte ich, dass der Nutzer diese Variabel nicht überschreiben dürfen soll.
Also eine Art Global Variable die nur in außerwählten Prozeduren läuft nach außen hin aber sonst nicht sichtbar ist.
es geht darum, ich möchte ein paar Prozeduren schreiben die alle auf die selbe Variable bzw. LinkedList zugreifen.
Ich hätte es gern so, die verschiedenen Prozeduren sollen darauf zugreifen können allerdings möchte ich, dass der Nutzer diese Variabel nicht überschreiben dürfen soll.
Also eine Art Global Variable die nur in außerwählten Prozeduren läuft nach außen hin aber sonst nicht sichtbar ist.
I´a dllfreak2001
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
das einfachste wäre wohl, diese Variable Shared zu deklarieren,
und alles bis auf deine Inits auch in einer Main()-Procedure zu kapseln.
zugriff auf deine Shared hat man dann nur von Hauptcode aus wo nur Inits stehen, und von den Procs die sie Shared benutzen.
... oder mach ne DLL aus deinen Routinen, Globals der DLL sind nicht extern zugänglich.
... oder mach für deine Funktionen eine INIT, die einen speicher allociert,
und den Pointer verrätst du nur deinen eigenen Procs.
und alles bis auf deine Inits auch in einer Main()-Procedure zu kapseln.
zugriff auf deine Shared hat man dann nur von Hauptcode aus wo nur Inits stehen, und von den Procs die sie Shared benutzen.
... oder mach ne DLL aus deinen Routinen, Globals der DLL sind nicht extern zugänglich.
... oder mach für deine Funktionen eine INIT, die einen speicher allociert,
und den Pointer verrätst du nur deinen eigenen Procs.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
Du könntest das mit einer Struktur lösen. In dieser Struktur gibt es auch einen Eintrag der die Schreib/Lese Berechtigungen auf die Variable/LinkedList festlegt. Und jede Procedur hat ein ein Level eingespeichert, was sie mit der Variable/LL machen darf. Klingt jetzt komplex, aber ein kleiner Demo-Code machts vlt. verständlicher:
Code: Alles auswählen
Enumeration
#Right_Nothing
#Right_Read
#Right_Write
EndEnumeration
Structure _Rights
Level.i[3]
EndStructure
Structure _Data
Value.i
String.s
EndStructure
Structure _Entry
Data._Data
Rights._Rights
EndStructure
Global TestVar._Entry
TestVar\Rights\Level[0] = #Right_Nothing
TestVar\Rights\Level[1] = #Right_Read
TestVar\Rights\Level[2] = #Right_Write | #Right_Read
Macro TestCode()
If Rights & #Right_Read
Debug "Ich darf lesen"
Debug *Var\Data\String
Debug *Var\Data\Value
EndIf
If Rights & #Right_Write
Debug "Ich darf schreiben"
*Var\Data\String = "blubblub"
*Var\Data\Value = 1234
EndIf
If Rights = #Right_Nothing
Debug "Ich darf gar nix :("
EndIf
EndMacro
Procedure Test1(*Var._Entry)
Protected SecurityLevel = 0
Protected Rights = *Var\Rights\Level[SecurityLevel]
TestCode()
EndProcedure
Procedure Test2(*Var._Entry)
Protected SecurityLevel = 1
Protected Rights = *Var\Rights\Level[SecurityLevel]
TestCode()
EndProcedure
Procedure Test3(*Var._Entry)
Protected SecurityLevel = 2
Protected Rights = *Var\Rights\Level[SecurityLevel]
TestCode()
EndProcedure
Test3(@TestVar)
Test2(@TestVar)
Test1(@TestVar)
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster
PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
- 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: Protected...Private... Variable schützen
Das ist nur mit Userlibs möglich.dllfreak2001 hat geschrieben:Hi Leutz,
es geht darum, ich möchte ein paar Prozeduren schreiben die alle auf die selbe Variable bzw. LinkedList zugreifen.
Ich hätte es gern so, die verschiedenen Prozeduren sollen darauf zugreifen können allerdings möchte ich, dass der Nutzer diese Variabel nicht überschreiben dürfen soll.
Also eine Art Global Variable die nur in außerwählten Prozeduren läuft nach außen hin aber sonst nicht sichtbar ist.
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.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Danke Leutz...
Mit shared und der Schreiblesemthode läuft es leider nicht so wie ich es mir vorstelle.
Ich denke ts-soft hat leider Recht.
Ich denke an sowas wie an
private static int Variable
aus Java.
Die ist nur in der Klasse verwendbar in der sie deklariert wurde.
Das wäre vielleicht mal ein Verbesserungsvorschlag für PB.
Mit shared und der Schreiblesemthode läuft es leider nicht so wie ich es mir vorstelle.
Ich denke ts-soft hat leider Recht.
Ich denke an sowas wie an
private static int Variable
aus Java.
Die ist nur in der Klasse verwendbar in der sie deklariert wurde.
Das wäre vielleicht mal ein Verbesserungsvorschlag für PB.
Code: Alles auswählen
Explicit Variable.Datentyp
Procedure PName()
Validate Variable
EndProcedure
I´a dllfreak2001
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
ja.. das große problem von Shared in PB ist eben,
dass die Var im Hauptcode selber erstmal Shared definiert sein muss.
... jedenfalls war das bisher so...
... ist es auch noch ...=> ERROR
dass die Var im Hauptcode selber erstmal Shared definiert sein muss.
... jedenfalls war das bisher so...
... ist es auch noch ...
Code: Alles auswählen
EnableExplicit
Procedure.l test1( a1.l )
Shared tester.l
EndProcedure
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
Warumm =>ERROR ?Kaeru Gaman hat geschrieben:ja.. das große problem von Shared in PB ist eben,
dass die Var im Hauptcode selber erstmal Shared definiert sein muss.
... jedenfalls war das bisher so...
... ist es auch noch ...=> ERRORCode: Alles auswählen
EnableExplicit Procedure.l test1( a1.l ) Shared tester.l EndProcedure
Ich hab mal nachgedacht wird bei meiner Methode im Code auch noch eine globale Variable erzeugt die genauso heißt wie meine geschützte dann gibbet Ärger.
Also bräuchte man noch sowas ähnliches wie das this.blabla aus Java...
Code: Alles auswählen
Global Variable.Datentyp2
Explicit Variable.Datentyp
Procedure PName()
Validate Variable
*.Variable = 4 ; *. kennzeichnet die geschützte Variable...
Variable = 2
EndProcedure
I´a dllfreak2001
- hjbremer
- Beiträge: 822
- Registriert: 27.02.2006 22:30
- Computerausstattung: von gestern
- Wohnort: Neumünster
da du von Klassen geredet hast, bau dir doch eine ! Innerhalb des Interfaces/Klasse sind deine Variablen bekannt, außerhalb nicht.
hier eine Demo:
hier eine Demo:
Code: Alles auswählen
Interface IcMyTest
Prozedur1()
Prozedur2()
Prozedur3()
getVar9()
EndInterface
Structure cMyTest
*VTablecMyTest
var1.i
var2.i
var3.i
var4.i
var5.i
var6.i
var7.i
var8.i
var9.i
EndStructure
Procedure IcMyTest_ObjectCreate(a,b,c,d)
Protected *this.cMyTest = AllocateMemory(SizeOf(cMyTest))
If Not *this: ProcedureReturn #Null: EndIf
*this\VTablecMyTest = ?VTablecMyTest
*this\var1 = a
*this\var2 = b
*this\var3 = c
*this\var4 = d
ProcedureReturn *this
EndProcedure
Procedure IcMyTest_Prozedur1(*this.cMyTest)
*this\var9 = *this\var1 + *this\var2
ProcedureReturn 0
EndProcedure
Procedure IcMyTest_Prozedur2(*this.cMyTest)
*this\var9 = *this\var3 + *this\var4
ProcedureReturn 0
EndProcedure
Procedure IcMyTest_Prozedur3(*this.cMyTest)
*this\var5 = 100
*this\var6 = 200
*this\var7 = 100
*this\var8 = 200
*this\var9 = *this\var5 + *this\var6 + *this\var6 + *this\var7
ProcedureReturn 0
EndProcedure
Procedure IcMyTest_getVar9(*this.cMyTest)
ProcedureReturn *this\var9
EndProcedure
DataSection
VTablecMyTest:
Data.i @ IcMyTest_Prozedur1()
Data.i @ IcMyTest_Prozedur2()
Data.i @ IcMyTest_Prozedur3()
Data.i @ IcMyTest_getVar9()
EndDataSection
;=Demo=================================================================
LV1.IcMyTest = IcMyTest_ObjectCreate(3,4,5,6)
lv1\Prozedur2()
Debug lv1\getVar9()
lv1\Prozedur3()
Debug lv1\getVar9()
Purebasic 5.70 x86 5.72 X 64 - Windows 10
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
Der Computer hat dem menschlichen Gehirn gegenüber nur einen Vorteil: Er wird benutzt
grüße hjbremer
- dllfreak2001
- Beiträge: 2925
- Registriert: 07.09.2004 23:44
- Wohnort: Bayern
-
- Beiträge: 17389
- Registriert: 10.11.2004 03:22
> Warumm =>ERROR ?
hast dus nit laufen lassen?
eben weil die Variable auch außerhalb der Procedures definiert ist/sein muss,
damit sie in Procedures Shared sein kann.
mit EnableExplicit wird die nicht außerhalb definierte Shared-Variable angemeckert.
hast dus nit laufen lassen?
eben weil die Variable auch außerhalb der Procedures definiert ist/sein muss,
damit sie in Procedures Shared sein kann.
mit EnableExplicit wird die nicht außerhalb definierte Shared-Variable angemeckert.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Der Weise weiß, dass er ein Narr ist.