Protected...Private... Variable schützen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Protected...Private... Variable schützen

Beitrag 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.
I´a dllfreak2001
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Beitrag 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)
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Benutzeravatar
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

Beitrag 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.
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.
Bild
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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



I´a dllfreak2001
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag 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 
I´a dllfreak2001
Benutzeravatar
hjbremer
Beiträge: 822
Registriert: 27.02.2006 22:30
Computerausstattung: von gestern
Wohnort: Neumünster

Beitrag 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()


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
Benutzeravatar
dllfreak2001
Beiträge: 2925
Registriert: 07.09.2004 23:44
Wohnort: Bayern

Beitrag von dllfreak2001 »

Danke, da muss ich mich erstmal reinarbeiten...
I´a dllfreak2001
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten