Globale Variablen unüberschreibbar machen?

Anfängerfragen zum Programmieren mit PureBasic.
ReneMiner
Beiträge: 58
Registriert: 20.07.2007 14:54
Wohnort: zwischen Westerwald und Siegerland

Globale Variablen unüberschreibbar machen?

Beitrag von ReneMiner »

Folgendes:
Ich hab mir ein Modul (eine Include-Datei) zur Gamepad-Abfrage gebastelt. Dieses hat eigentlich nur zwei Proceduren und die Strukturen-Deklarationen. Für die Abfrage wichtig ist nur:

Code: Alles auswählen


structure einGamepad
     XAxis.l
     YAxis.l
     ZAxis.l
     rZAxis.l
     HiAxis.l
     POVState.l
     POVReleased
     ButtonPressed[12]
     ButtonReleased[12]
endstructure

global dim GamePad.einGamepad(0)


So ruf ich aus meinem Hauptprogramm dann z.B. auf

Code: Alles auswählen

hatGamePad = Initgamepads(#)
und es werden # Gamepad()s dimensioniert und die Dinger werden auch gleich aquried.

Code: Alles auswählen

while hatGamepad
    hatGamePad = ExamineGamepad()
; gamepad() auswerten
wend
Bei InitGamepads wird der im Gamepad-Modul deklarierte Globale Structure-Array Gamepad() auf die Zahl der gewünschten Gamepads dimensioniert und per
ExamineGamepad(#)
wird die GamePad()-Struktur für Gamepad(#) mit den entsprechenden Daten gefüllt.

Kann ich die im Gamepad-Modul deklarierte Gamepad.einGamepad(#) für die anderen Module meines Codes lesbar aber unüberschreibbar machen so das die Gamepad()-Structure nur im Gamepad-Code-Modul ausgefüllt aber von keinem anderen Code (z.B. im Hauptprgramm oder Math-Modul usw) geändert werden kann. Sozusagen "Read-Only" ausserhalb der Gamepad-Abfragen?
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Nein, das geht nicht.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

edel hat geschrieben:Nein, das geht nicht.
Aber Du kannst es selbst so programmieren.
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Froggerprogger
Badmin
Beiträge: 855
Registriert: 08.09.2004 20:02

Beitrag von Froggerprogger »

Sobald die Adresse eines Speicherbereichs bekannt ist - wie bei der Übergabe der Struktur - kann dieser auch überschrieben werden.

Du musst also selbst darauf achten, nur lesend zuzugreifen.

Als Alternativen fallen mir nur ein:
1) Zugriffe auf Strukturenfelder von anderen Modulen nur über Getter-Procedure oder -Makros, also bsp.

Code: Alles auswählen

Procedure.l GetXAxis(*x.einGamepad)
  ProcedureReturn *x\XAxis
EndProcedure

; oder

Macro GetXAxis(gp)
  gp\XAxis
EndMacro
Gerade der Makro-Zugriff bedeutet hier null Zeitverlust bei mehr Code-Sicherheit.

2) ein weiteres Feld an die Struktur anhängen, welches eine CRC-Checksumme der restlichen Felder enthält. Diese wird zum Ende des Befüllens mit Daten geschrieben, und zu Beginn überprüft, ob in der Zwischenzeit Änderungen vorgenommen wurden.
!UD2
Benutzeravatar
edel
Beiträge: 3667
Registriert: 28.07.2005 12:39
Computerausstattung: GameBoy
Kontaktdaten:

Beitrag von edel »

Dr. Shrek hat geschrieben:
edel hat geschrieben:Nein, das geht nicht.
Aber Du kannst es selbst so programmieren.
Natuerlich, es macht ja keinen Sinn eine Include zu
benutzen und dann deren Variablen zu ueberschreiben.
ReneMiner
Beiträge: 58
Registriert: 20.07.2007 14:54
Wohnort: zwischen Westerwald und Siegerland

Beitrag von ReneMiner »

Froggerprogger hat geschrieben:...
2) ein weiteres Feld an die Struktur anhängen, welches eine CRC-Checksumme der restlichen Felder enthält. Diese wird zum Ende des Befüllens mit Daten geschrieben, und zu Beginn überprüft, ob in der Zwischenzeit Änderungen vorgenommen wurden.

Checksumme: Ja das ist einfach und eine richtig gute Idee. Danke
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

der tiefere sinn würde mich jetzt doch noch interessieren...

wenn code, der die inhalte zuweist, nur innerhalb deiner Includes ausgeführt wird,
wozu musst du diese variablen dann schützen?

oder rechnest du damit, dass der code woanders ausgeführt wird, und dort jemand gamepads emulieren will?
(das würde dann doch eh über'n treiber laufen, und nicht auf deine structs zielen)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Antworten