Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

25.08.2010, 18:30

unsigned long in float

hallo,

ich habe eine klasse CMouse, die mit Hilfe von DirectInput die Mausposition bestimmt.

code:

C-/C++-Quelltext

1
2
DIDEVICEOBJECTDATA mMouseEvents[32];
mPosition.mX += static_cast<float>(mMouseEvents[i].dwData*mSpeed);


mPosition.mX und mSpeed sind float werte mMouseEvents.dwData scheint ein DWORD zu sein. das problem ist, solange ich die maus nur nach rechts oder unten bewege funktioniert alles(dwData ist positiv), aber wenn dwData negativ wird (was meiner nach garnicht geht, da DWORD unsigned long ist) gehen die koordinaten irgendwo ins nirvana. Als ich früher integer benutzt habe hat das immer funktioniert, warum mit float nicht?

2

25.08.2010, 19:07

Auf jeden Fall solltest du das mSpeed aus dem Cast rausziehen. Ich weiß nicht genau, wie es jetzt definiert ist, aber entweder ist DWORD*float schon ein float, wodurch der cast unnötig wäre, oder aber es wird ein DWORD und Nachkommastellen werden abgeschnitten.
Lieber dumm fragen, als dumm bleiben!

Zeus

Frischling

Beiträge: 83

Beruf: Schule

  • Private Nachricht senden

3

31.08.2010, 03:26

DWORD ist soweit ich weis ein INT ... zumindest gebe ich bei Funktionen mit Rückgabetyp DWORT meistens einfach eine 0 zurück. Sollte Speed ein FLOAT sein (was ich annehme) wird der ganze Ausdruck zu INT und dann zu nem FLOAT gecastet (was wenig Sinn ergibt).

Das mit dem "ins Nirvana abdrifften" kenn ich. Du musst mal Step-for-Step den Debugger durchgehn und es iwo mit Absicht mit einem negativen Wert füttern ... Wahrscheinlich steht dann iwas wie "#" drin ... Also kann er nicht mit rechnen und er macht iwas unvorhersehbares ...

Das mit dem "rechts oder unten" ... Das sind die Positiven Koordinatenachsen. Also gibt es - wenn es anders nicht geht - ein Problem mit einer negativen koordinatenverschiebung. Deiner Rechnung nach zu urteilen enthällt das EVENT ein Differenz aus letzter Position und aktueller ... evlt ist auch das das Problem. Ich nehme an es beinhaltet lediglich die Koordinaten und die Differenzenbildung musst du selber bilden.

mehr fällt mir jetzt auch nich ein.

Mfg
Ich würde die Welt gerne verbessern, doch Gott gibt mir den Quellcode nicht!

Sprachen: C,C++/CLI,C#,ASM,PHP,Java(-script) ... fürn Anfang auch genug ...

Mein letztes Projekt:

http://www.youtube.com/watch?v=vU14ewcVaXU

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

31.08.2010, 11:02

DWORD ist doch unsigned.
Das heißt, bei der Konvertierung nach float kann kein negativer float dabei herauskommen.
Also mach es mal so:

C-/C++-Quelltext

1
mPosition.mX += static_cast<int>(mMouseEvents[i].dwData) * mSpeed;


Den äußeren Cast braucht man in der Tat nicht, weil int * float = float ;)

5

31.08.2010, 15:54

genau so funktioniert es, danke :)

Werbeanzeige