Probleme mit Zuweisung
-
Hi,
ich arbeite mich gerade in Managed DirectX 9 mit C# ein und stoße dabei auf ein Problem. Um Tastatureingaben zu verarbeiten will ich jeweils den vorherigen Tastaturzustand und den aktuellen speichern. Eind Code-Schnipsel:
Microsoft.DirectX.DirectInput.KeyboardState m_OldKeyboardState; Microsoft.DirectX.DirectInput.KeyboardState m_KeyboardState; // ... /// und dann jeden Frame das: m_OldKeyboardState = m_KeyboardState; ///// <----- WICHTIG // und dann wird m_keyboardState aktualisiert...
Das Problem scheint die Zuweisung zu sein. Irgendwie enthält m_OldKeyboardState das gleiche wie m_KeyboardState. Kann es sein, dass C# bei der Zuweisung nur mit den Referenzen arbeitet, dass also beide auf die gleiche Speicherzelle verweisen? Wenn ja, wie kann ich ein explizites Kopieren erzwingen???
Danke. Mfg, smasher1985
-
smasher1985 schrieb:
Kann es sein, dass C# bei der Zuweisung nur mit den Referenzen arbeitet
nein
mal ne blöde frage:
für was brauchst du das m_OldKeyboardState? Sag mal was du machen willst, dann fällt mir mehr dazu ein
-
C# kennt sowohl eine Zuweisung zwischen Referenzen als auch eine mit Werten.
-
...und wenn 'Microsoft.DirectX.DirectInput.KeyboardState' eine klasse ist, dann wird mit '=' wohl eine referenz zugewiesen und nicht das objekt kopiert oder?
-
An deiner Stelle würde ich die Reihenfolge der Zuweisungen nochmals genau anschauen. Vielleicht liegt die Zuweisung vor dem Vergleich mit den Daten...
-
@c#ecker: ich will den alten KeyboardState speichern, weil ich bei der Verarbeitung von Tastatureingaben unterscheiden will zwischen KEY_PRESSED und KEY_DOWN sowie KEY_RELEASED und KEY_UP. Dabei soll jeweils KEY_PRESSED und KEY_RELEASED nur ausgelöst werden bei einer Zustandsänderung (deshalb der alte Zustand!).
@net: genau diese Vermutung hab ich auch. Dass eben nur Referenzen getauscht werden und beide Zustände auf der selben Speicheradresse arbeiten.
@h4xX0r: die Reihenfolge der Zuweisungen ist korrekt so.
Noch irgendjemand eine Meinung dazu???
Gruß, smasher1985
-
Das Teil ist eine Klasse; die Zuweisung kopiert lediglich die Referenz.
Du kannst dir eine richtige Kopie ziehen; für den Fall, daß sämtliche Members/Properties primitive Datentype sind und nicht auch wieder Referenzen, dann könnte dir vielleicht die MemberwiseClone();Methode weiterhelfen (deklariert in Object).
-
@Raving Tux: Danke, MemberwiseClone() könnte funktionieren, da KeyboardState glaub ich keine weiteren Referenzen enthält.
Nur mal interessehalber: Gibts auch eine Möglichkeit ein richtiges Deep Copy durchzuführen, bei dem also auch alle Referenzen aufgelöst und kopiert werden?
Mfg, smasher1985
-
smasher1985 schrieb:
Nur mal interessehalber: Gibts auch eine Möglichkeit ein richtiges Deep Copy durchzuführen, bei dem also auch alle Referenzen aufgelöst und kopiert werden?
würdest du java verwenden... da geht das ganz easy und funzt saugut (ObjectOutputStream etc.) aber bestimmt kann .net sowas ähnliches auch.
-
smasher1985 schrieb:
Nur mal interessehalber: Gibts auch eine Möglichkeit ein richtiges Deep Copy durchzuführen, bei dem also auch alle Referenzen aufgelöst und kopiert werden?
-
guckst du auch: http://www.codeguru.com/forum/showthread.php?threadid=242411
aber das mit den 60 sekunden ist schon merkwürdig