Casting + 2 Pointer als Parameter ??



  • Guten Tag,
    ich habe eine Frage auf die ich einfach keine Lösung finde.
    Liegt aber wahrscheinlich da dran das ich den genauen Suchbegriff nicht kenne.
    Nun zu meiner eigentlichen Frage:
    In manchen Tutorials bzw. Büchern sehe ich Funktionen bzw. Methoden welche folgendes als Parameter erwarten: ((DWORD)(&var))
    Soweit ich das richtig verstanden habe steht DWORD fürs Casting der Referenz &var nach DWORD. Doch wozu das * nach DWORD ? Ich meine funktioniert es nicht einfach so (DWORD) anstatt (DWORD*) ? und was bedeutet das * ganz am Anfang vor DWORD ? 😮
    Bin wirklich über jeden Hinweis dankbar, da ich echt nicht mehr weiß wonach ich suchen soll. 😞

    MfG IncogNito



  • IncogNito schrieb:

    In manchen Tutorials bzw. Büchern sehe ich Funktionen bzw. Methoden welche folgendes als Parameter erwarten: ((DWORD)(&var))

    Mit sicherheit erwarten sie dies nicht als Parameter, sondern du siehst dies als Aufruf. Das was du dort siehst ist weder ein Beispiel für saubere Programmierung noch in C++ vorzuziehen. Auch wenn die C++ Konvertierungen mehr Schreibaufwand sind.

    &var => Adresse der Variablen var (Dessen Originaltyp ich nicht kenne)

    (DWORD*)(&var) => Ein sogenannter C-Cast. Die Adresse (&var) wird in den Typ (DWORD*) umgewandelt. Ohne Gültigkeitsprüfungen etc. In C++ verwendet man für Umwandlungen, je nach Art: static_cast, const_cast, dynamic_cast, reinterpret_cast...

    ((DWORD)(&var)) => Der in ein DWORD* umgewandelte Ausdruck ((DWORD*)(&var)) wird nun wieder als Wert interpretiert, unabhängig von seinen ursprünglichen Inhalt. Da wir ein DWORD-Zeiger haben, lesen wir hier den Wert als DWORD aus dem Speicherberech aus, auf den der Zeiger verweist.

    cu André



  • Ich glaube besser hätte man es nicht erklären können. Vielen Dank! 🙂

    Gruß Inco



  • Hallo,
    habe noch eine kleine Frage zum C-Casting.
    Unswar wenn ich jetzt folgenden Code habe und ein Casting von float nach int machen möchte, dann kriege ich einen "merkwürdigen" Wert.

    float abc = 123.4;
    	int * asdf =  (int*)&abc;
    
    	cout << *(int*)&asdf <<endl; //1245024
    	cout << *asdf; //1123470541
    
           cout << *(float*)&asdf <<endl; //1.74465e-039
    

    Kann mir bitte einer verraten wie ich für den Pointer asdf den int Wert 123 rauskriege ? Bzw. den float Wert 123.4.

    Mit freundlich Grüßen

    Inco



  • Wenn du nur von float nach int casten willst brauchst du dieses Gewürge gar nicht.

    float abc = 123.4;
    // das sollte reichen, bringt aber evtl. eine Warnung
        int asdf =  abc; 
    // dann eher so
        asdf = static_cast<int>(abc);
    


  • Danke,
    aber wie schaut es bei Pointern aus ?
    Weil ich in vielen Beispielen gesehen habe das Pointer als Parameter an Funktionen per C-Cast übergeben wurden (ich weiß das es keine saubere Art ist).
    Aber wie stelle ich das Casting mit Pointern ordentlich an ?

    Gruß Inco



  • IncogNito schrieb:

    Danke,
    aber wie schaut es bei Pointern aus ?
    Weil ich in vielen Beispielen gesehen habe das Pointer als Parameter an Funktionen per C-Cast übergeben wurden (ich weiß das es keine saubere Art ist).
    Aber wie stelle ich das Casting mit Pointern ordentlich an ?

    Gruß Inco

    Wenn es wirklich sein muss, dann mit static_cast<>. Es kann auch vorkommen, dass du reinterpret_cast<> brauchst, wenn du mit einer C-API arbeitest. Aber wie gesagt, wenn es sich vermeiden lässt, dann keine Casts..



  • Ich habs jetzt so versucht:

    float abc = 123.4;
    	int * asdf =  (int*)&abc;
    	cout << *static_cast<int*>(asdf) <<endl; //1123470541
    

    Das Ergebniss ist aber immernoch 1123470541 anstatt 123.
    Was mache ich falsch ? Ein kleines Beispiel mit einem Pointer wäre nett (ohne Pointer klappts super).

    Gruß Inco



  • IncogNito schrieb:

    Ich habs jetzt so versucht:

    float abc = 123.4;
    	int * asdf =  (int*)&abc;
    	cout << *static_cast<int*>(asdf) <<endl; //1123470541
    

    Das Ergebniss ist aber immernoch 1123470541 anstatt 123.
    Was mache ich falsch ? Ein kleines Beispiel mit einem Pointer wäre nett (ohne Pointer klappts super).

    Gruß Inco

    Was willst du mit so einem Code bezwecken? Im Grunde missbrauchst du in deinem Code nur einen int Zeiger um das Bytemuster eines floats wie einen int zu interpretieren. In der 2. Zeile solltest du einen reinterpret_cast benutzen und der cast in Zeile 3 ist sinnlos, da asdf bereits vom Typ int* ist.
    Bei deinem Code sollte NIE der Wert 123 ausgegeben werden, da hast du einen Denkfehler. Wie geagt: Der ausgegebene Wert ist einfach die int Interpretierung des float Werts.



  • Das Problem ist, dass du intern ein anderes Bit Muster hast und wenn du lediglich einen Zeiger darauf castest, dann passiert intern des eigentlichen Wertes überhaupt nix. Und somit wird das Bit Muster anderst interpretiert und du hast einen "unsinnigen" Wert.


Anmelden zum Antworten