Pointerfrage zu Struktur ....



  • Hallo,

    habe folgendes Problem:

    ich mache einen Force Feedback Effect:

    DIEFFECT diEffect;
    	ZeroMemory( &diEffect, sizeof(diEffect) );
    	DWORD Axes[2] = { DIJOFS_X, DIJOFS_Y };
    	LONG Direction[2] = { 90 * DI_DEGREES, 90 * DI_DEGREES };
    	diConstant.lMagnitude			= DI_FFNOMINALMAX;
    	diEffect.dwSize					= sizeof(DIEFFECT);
    	diEffect.dwFlags				= DIEFF_CARTESIAN | DIEFF_OBJECTOFFSETS;
    	diEffect.dwDuration				= (DWORD)(2 * DI_SECONDS);
    	diEffect.dwGain					= DI_FFNOMINALMAX;
    	diEffect.rglDirection			= Direction;
    	diEffect.dwTriggerButton		= DIEB_NOTRIGGER;
    	diEffect.dwTriggerRepeatInterval= 0;
    	diEffect.cAxes					= 2;
    	diEffect.rgdwAxes				= Axes;
    	diEffect.cbTypeSpecificParams	= sizeof(DICONSTANTFORCE);
    	diEffect.lpvTypeSpecificParams	= &diConstant;
    

    nun lese ich den Wert
    diEffect.rgdwAxes
    wieder aus. Wie man sieht ist da schon beim Erstellen eine Ungereimtheit,
    denn wieso kann man da ein DWORD array übergeben obwohl es ein einziges
    DWORD ist.
    Dementsprechend habe ich beim auslesen einen "long" wert mit 10106000 ??
    Warum ist das so ?

    Auslesen mit:
    getAxesDword = *(diEffect.rgdwAxes);

    Wie krieg ich meine Achsen wieder zurück ?
    Das scheint ein simpler Pointerfehler von mir zu sein ....



  • thenoname schrieb:

    ...
    	DWORD Axes[2] = { DIJOFS_X, DIJOFS_Y };
    ...
    	diEffect.rgdwAxes	= Axes;
    ...
    

    Wie krieg ich meine Achsen wieder zurück ?

    diEffect.rgdwAxes ist wohl ein pointer auf DWORD? dann weist du dem die adresse des arrays zu.
    in 'diEffect.rgdwAxes[0]' steht 'DIJOFS_X'
    und in 'diEffect.rgdwAxes[1]' steht 'DIJOFS_Y'



  • Schön, das noch jemand wach ist 😉

    diEffect.rgdwAxes ist ein LPDWORD.

    diEffect.rgdwAxes[0] ist laut Compiler eine unzulässige Zeigeroperation ?

    doch was hat es damit auf sich, das im Debugger die Struktur aus lauter
    long Variablen besteht ? ist das normal im debugger ?

    Achja, und das DIJOFS_X ist in Dinput so definiert, ein Offset ..

    #define DIJOFS_X FIELD_OFFSET(DIJOYSTATE, lX)



  • thenoname schrieb:

    diEffect.rgdwAxes[0] ist laut Compiler eine unzulässige Zeigeroperation ?
    ...
    doch was hat es damit auf sich, das im Debugger die Struktur aus lauter
    long Variablen besteht ? ist das normal im debugger ?

    kann es sein, dass in der datei, in der du den zugriff machst, die struct nicht bekannt ist (header nicht #included)?



  • long = DWORD
    Und bei Pointern zeigt der Debugger immer das Element an, worauf gezeigt wird. Das noch n gleiche dahinter sind, kann er nicht wissen.

    Vielleicht sollest du erstmal lernen, wie man mit Pointern etc. umgeht...

    Bye, TGGC (Der Held bei Dir!)



  • TGGC schrieb:

    long = DWORD

    fast richtig. 'unsigned long' == DWORD



  • mag sein, mag sein ...

    leider ist der angezeigte long Wert nicht gleich dem von mir eingetragenem Wert.
    Und ja, die includes sind vorhanden, sonst gäbs auch keine DIEFFECT Struktur.
    Nachdem der Pointer auf das erste Element zeigen sollte habe ich mir auch schon
    das nächste Element angeschaut, das ebenso nichts mit einem DIJOFS_X oder
    DIJOFS_Y gemeinsam hat.
    Auch verändert sich der long Wert ab und zu. Wie eine Pointer-Speicheradresse
    sieht er allerdings nicht aus.

    Aber vielleicht liegt es an etwas anderem ...
    Ich übergebe nämlich die Struktur aus einer DLL heraus an das Hauptprogramm.
    Es stimmen übrigens alle Werte bis auf die rgdwAxes und rglDirection die
    als einziges Pointer auf Arrays (Anfang) sind.
    In der DLL stimmen die Werte noch, auf die der Pointer diEffect.rgdwAxes zeigt.
    Nach der Übergabe ist es ein hoher, wirrer Wert ...
    Kann es ein, das die Übergabe solcher Pointer illegal ist ?


Anmelden zum Antworten