Seite 1 von 2
Protected...Private... Variable schützen
Verfasst: 10.01.2009 18:09
von dllfreak2001
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.
Verfasst: 10.01.2009 18:14
von Kaeru Gaman
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.
Verfasst: 10.01.2009 18:27
von cxAlex
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)
Re: Protected...Private... Variable schützen
Verfasst: 10.01.2009 18:35
von ts-soft
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.
Das ist nur mit Userlibs möglich.
Verfasst: 10.01.2009 18:50
von dllfreak2001
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.
Code: Alles auswählen
Explicit Variable.Datentyp
Procedure PName()
Validate Variable
EndProcedure
Verfasst: 10.01.2009 19:05
von Kaeru Gaman
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 ...
Code: Alles auswählen
EnableExplicit
Procedure.l test1( a1.l )
Shared tester.l
EndProcedure
=> ERROR
Verfasst: 10.01.2009 19:44
von dllfreak2001
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 ...
Code: Alles auswählen
EnableExplicit
Procedure.l test1( a1.l )
Shared tester.l
EndProcedure
=> ERROR
Warumm =>ERROR ?
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
Verfasst: 10.01.2009 19:51
von hjbremer
da du von Klassen geredet hast, bau dir doch eine ! Innerhalb des Interfaces/Klasse sind deine Variablen bekannt, außerhalb nicht.
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()
Verfasst: 10.01.2009 19:54
von dllfreak2001
Danke, da muss ich mich erstmal reinarbeiten...
Verfasst: 10.01.2009 21:22
von Kaeru Gaman
> 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.