Seite 1 von 1

Globale Variablen unüberschreibbar machen?

Verfasst: 09.08.2007 00:02
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?

Verfasst: 09.08.2007 06:11
von edel
Nein, das geht nicht.

Verfasst: 09.08.2007 08:31
von DrShrek
edel hat geschrieben:Nein, das geht nicht.
Aber Du kannst es selbst so programmieren.

Verfasst: 09.08.2007 11:46
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.

Verfasst: 09.08.2007 12:19
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.

Verfasst: 13.08.2007 03:12
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

Verfasst: 13.08.2007 10:00
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)