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.