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

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

1

07.03.2012, 20:10

DirectInput8: Tasten aufzählen funktioniert nicht richtig

Hallo zusammen.
Dieser Code ist nicht fehleranfällig, trotzdem funktioniert er nicht:

Ich versuche, alle Tasten meiner Tastatur (besser gesagt, alle "Objekte" meiner Tastatur -> also auch Buttons, Pushbuttons oder so) aufzulisten:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
// Hierein sollen alle Tasten aufgelistet werden
BOOL CALLBACK ZeigHerWasDuHast(const DIDEVICEOBJECTINSTANCE* instance, VOID* context)
{
    // Schon hier gibts Probleme:
    // Die DIDEVICEOBJECTINSTANCE-Struktur ist nicht ausgefüllt?

    return DIENUM_CONTINUE;
}

// (Weiter unten im Code)

// Sollte verständlich sein :)
keybdr.m_lpDevice->EnumObjects(ZeigHerWasDuHast, nullptr, DIDFT_ALL);


Also:
- Die Tastaturschnittstelle funktioniert wie ne eins, auch die Strukturen sind sauber ausgefüllt.
- Ich verwende übrigens nullptr anstelle von NULL (sagtmal was ihr davon haltet bitte, das hab ich in nem neuen Buch gelesen)

Die Struktur (DIDEVICEOBJECTINSTANCE) sieht dann so aus:


(Link)


Ich hab keine Ahnung was da nicht stimmt, zumal ich den Code im Buch wie im Internet so finde :(

Vielen Dank für jede Form von Hilfe,
Johannes Schneider
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

07.03.2012, 20:19

Dein lpddoi ist 0...

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

3

07.03.2012, 20:25

Ja aber warum ist das denn nun 0 ? :)

(Das Auf dem Bild soll "instance" sein, ich hatts mal lpddoi genannt, das ist aber das gleiche)
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

07.03.2012, 20:32

Gute Frage. Der Debugger wird dir helfen das rauszufinden ;)

EDIT: Kann's sein, dass du da einen Release Build debuggst?

Btw: nullptr ist, was man verwenden sollte. Vor der Einführung von nullptr (noch nichtmal ein Jahr her), war in C++ außerdem eher einfach nur 0 üblich. Das Makro NULL kommt aus C, in C++ ist es einfach nur ein #define für 0 und existiert wohl vor allem aus Kompatibilitätsgründen...

Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von »dot« (07.03.2012, 20:42)


birdfreeyahoo

Alter Hase

Beiträge: 756

Wohnort: Schorndorf

Beruf: Junior Software Engineer

  • Private Nachricht senden

5

07.03.2012, 20:44

ähmm...Ich nehme mal an, dass wenn man einen nullpointer übergibt, die Strujtur null ist. Bitte in der Funktion die Abfrage

C-/C++-Quelltext

1
2
3
4
if(instance == NULL)
{
instance.Release();
}


oder so ähnlich ;)

  • »Johannes Schneider« ist der Autor dieses Themas

Beiträge: 103

Beruf: Chemiestudent

  • Private Nachricht senden

6

07.03.2012, 20:52

Es lag wirklich an der Releaseversion 8|
(Ich hatts mal zum Testen umgestellt).

Ich wusste nicht dass mein Code nicht funktioniert wenn ich den Releasemode reinhaue. Ich les das mal nach.
Danke für die Hilfe!
"Das Glück des Forschers besteht nicht darin, die Wahrheit zu besitzen, sondern eine Wahrheit zu erringen. Und in diesem fortschreitendem, erfolgreichen Suchen nach der Wahrheit - darin liegt die
eigentliche Befriedigung." Max Planck

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

7

07.03.2012, 21:02

Dein Code funktioniert. Nur wird der Maschinencode im Release Build durch den Compiler optimiert, sodass z.B. unnötige Variablen weggelassen werden etc. Und nachdem die Variablen wegoptimiert wurden, kann der Debugger sie dann natürlich nichtmehr anzeigen ;)
Zum Debuggen verwendet man in der Regel eben einen Debug Build (hence then name). Debugging eines Release Build ist mit äußerster Vorsicht zu genießen.

8

07.03.2012, 21:02

Funktionieren sollte er trotzdem, nur debuggen nicht. ;)
EDIT: dot war fixer. ^^

Werbeanzeige