DWORD Datentyp addieren (Probleme)



  • Hallo Community,

    zuerst einmal wollte ich mich entschuldigen falls ich hier im völlig falschen Bereich im Forum poste, bin hier gerade neu.

    Zu meinem Problem:
    Ich bin momentan ziemlich mit C++ beschäftigt.
    In einem Header habe ich folgende DWORD Arrays angelegt.

    DWORD ADDR_Guns[] = {0x4D2260, 0x4D2388, 0x4D24B0, 0x4D25D8, 0x4D2700, 0x4D2828, 0x4D2950, 0x4D2A78, 0x4D2BA0, 0x4D2CC8};
    

    Das sind Pointer Addressen zu jeder einzelnen Waffe in einem Spiel.
    Nun ist in dem Game eine Struktur:

    struct CGunInfo 
    { 
    	char modelname[255];
    	short sound, reload, reloadtime, attackdelay, damage, projspeed, part, spread, recoil, magsize, mdl_kick_rot, mdl_kick_back, recoilincrease, recoilbase, maxrecoil, recoilbackfade, pushfactor;
    	bool isauto; 
    };
    

    Ich lege für jeden "Attribut" dieser Struktur ein weiteres Array an, dieses hat allerdings nur einen Wert, es muss aber ein Array sein, weil eine Funktion sonst nicht richtig funktioniert.

    Nunja eig. sind diese Informationen relativ unnötig was mein Problem angeht.
    Sagen wir es so.
    Der erste Pointer (vom Messer) ist 0x4D2260 und um den Attribut "Damage/Schaden" davon zu bekommen muss ich 0x10C dazu addieren. Wenn ich dies mit dem Windows Taschenrechner ausrechne kommt 0x4D236C heraus. Diese Adresse stimmt auch denn in Cheat Engine sehe ich, das es auf den richtigen Wert rausspringt.

    Jetzt versuche ich schon den ganzen Abend 0x4D2260 + 0x4D236C in c++ zu rechnen.
    Aber es kommt immer 0x4D2690 raus.

    Kann mir jemand ein Stück code zeigen wie ich die oben beiden genannten DWORDS addiere?

    Vielen Dank im Voraus 😃



  • Vorher (vor der Berechnung) zu char casten sollte das Problem lösen.


  • Mod

    Benutzt du wirklich DWORDS? Oder Zeigertypen? Zeig mal Code und prüf noch mal deine Fehlerbeschreibung, ich bin sicher, du hast da ein paar Zahlen falsch. Zeigerarithmetik ist dir bekannt?



  • Hallo,

    DWORD addr = 0x4D2260;
    DWORD offs = 0x00010C;
    cout << (addr + offs) << endl;
    

    Z.B. So, hab ich es probiert, jedoch kam dort ne gaaanz anderer Wert raus. Iwas mit 505usw.

    Dann hab ich es so probiert:

    DWORD* addr = (DWORD*)0x4D2260;
    DWORD* offs = (DWORD*)0x00010C;
    cout << (addr + offs) << endl;
    

    Aber hier gibts bei offs einen fehler beim intellisense. Ganzzahliger Enumerationsausdruck muss aufgewiesen werden oder sowas.

    ich möchte lediglich das aus 0x4D2260 + 0x00010C = 0x4D236C wird.

    wie stell ich das an?

    @SeppJ nein, ich kenn mich mit C++ kaum bis garnicht aus.


  • Mod

    Yothri schrieb:

    Hallo,

    DWORD addr = 0x4D2260;
    DWORD offs = 0x00010C;
    cout << (addr + offs) << endl;
    

    Z.B. So, hab ich es probiert, jedoch kam dort ne gaaanz anderer Wert raus. Iwas mit 505usw.

    Das war aber richtig. Ist bloß dezimal statt hexadezimal geschrieben.

    Dann hab ich es so probiert:

    DWORD* addr = (DWORD*)0x4D2260;
    DWORD* offs = (DWORD*)0x00010C;
    cout << (addr + offs) << endl;
    

    Aber hier gibts bei offs einen fehler beim intellisense. Ganzzahliger Enumerationsausdruck muss aufgewiesen werden oder sowas.

    Hier passiert ganz was anderes, als du denkst. Falls überhaupt etwas passiert, denn eigentlich dürfte das gar nicht compilieren. Ich vermute mal, dass du wohl eher

    DWORD* addr = (DWORD*)0x4D2260;
    DWORD offs = 0x00010C;
    cout << (addr + offs) << endl;
    

    hast, oder? Aber auch das macht nicht das, was du möchtest, das würde den Wert von addr um 0x00010C DWORD-Größen erhöhen, was viel mehr ist als 0x4D2260 + 0x00010C.



  • Und wie kann schreibe ich das ganze hexadezimal? 😃

    Beim Windows Taschenrechner geht es doch auch ganz einfach mit Plus..

    Edit: Ah so funktionierts:

    DWORD addr = 0x4D2260;
    DWORD offs = 0x00010C;
    cout << (DWORD*)(addr + offs) << endl;
    

    Danke für die Hilfe


  • Mod

    Yothri schrieb:

    Und wie kann schreibe ich das ganze hexadezimal? 😃

    Damit:
    http://www.cplusplus.com/reference/ios/hex

    Beim Windows Taschenrechner geht es doch auch ganz einfach mit Plus..

    Plus funktioniert doch auch. Macht auch das, was du denkst. Dezimal und Hexadezimal sind bloß unterschiedlicher Arten und Weisen, etwas aufzuschreiben.

    Edit: Ah so funktionierts:

    DWORD addr = 0x4D2260;
    DWORD offs = 0x00010C;
    cout << (DWORD*)(addr + offs) << endl;
    

    Ja, funktioniert. Aber verstehst du, warum? Beim Programmieren darfst du nicht einfach wild Zeichen einfügen, bis das gewünschte Ergebnis passiert, du musst verstehen, was du tust. Besonders Casts, und ganz besonders Casts im C-Stil (also die mit den Klammern) sind ein ganz, ganz gefährliches Mittel, weil du damit dem Compiler sagst, dass du es besser weißt als er. Das tust du als Anfänger aber nicht. Das heißt, dann funktioniert auf einmal fehlerhafter Unsinnscode scheinbar. Ich hoffe, du gewöhnst dir nun nicht an, alle Probleme durch Casts und wildes Rumprobieren zu lösen, nachdem du hier einmal mit Glück ein tatsächlich funktionierendes Ergebnis erhalten hast.



  • Hallo vielen Dank für den Link.

    Mein Vorhaben war eigentlich nur mal auf die Schnelle Informationen von einem Spiel zu erlangen.

    In der Schule fangen wir jetzt mit C++ an, wie gesagt das war jetzt nur ein einmaliger Test. 🙂

    Trotzdem vielen Dank für die Hilfe 🙂


Anmelden zum Antworten