char array cast auf enum?????????



  • Hallo,

    Das Programm bringt mich noch um....
    Im Programm ist das so definiert

    static char buffer[150000];
    

    ok 15000 char's.
    weiterhin das

    messages_code_type message_code;
    

    wobei messages_code_type ein ziemlich fetter enum (typedef enum ...) ist.

    und nun das....

    message_code = *(messages_code_type *) buffer;
    

    Der Buffer ist gefüllt mit 150000 Elementen (char). Im "message_code" steht einer der Einträge aus dem enum.
    Wie funktionert das???

    Gruß
    Franky



  • Enum == Int


  • Mod

    FrankTheFox schrieb:

    Wie funktionert das???

    Die ersten sizeof(int) Elemente des char-Arrays werden als int reinterpretiert (da enum==int). Das funktioniert natürlich nur, wenn man die zugrundeliegende Speicherstruktur eines int kennt. Hoffentlich hat derjenige, der dieses Programm geschrieben hat, auch daran gedacht, dass diese Struktur von Maschine zu Maschine anders sein kann.

    P.S.: Deine tastatur ist anscheinend kaputt, es sieht so aus, als ob die Fragezeichentaste stottert.



  • Ok,

    wir wissen das im buffer chars stehen, also werden aus den chars ints gemacht,
    bzw aus einem char ein int um sie dem enum typedef zuzuweisen. Damit man dann sieht welcher Eintrag im buffer ist.
    Tja dann hoffe ich mal das der enum aus so groß ist wie der buffer, sonst dürfte da kein gültiger enum Eintrag drin stehen.

    SeppJ schrieb:

    P.S.: Deine tastatur ist anscheinend kaputt, es sieht so aus, als ob die Fragezeichentaste stottert.

    Ne, ich hatte kurz einen Krampf in der Hand, nachdem ich mich zuvor beim Code lesen energisch an den Kopf gefasst hatte.

    Gruß
    Franky



  • Nein, aus sizeof(int)/sizeof(char) Chars wird ein Int gemacht.



  • Hi,

    Ok. Also gehe ich davon aus, das sizeof(int)/sizeof(char) Chars in meinem Fall dann ergibt:

    4/ 1 = 4 Chars => wenn also im buffer dann steht F\000\000\000 (erste vier chars bzw. buffer[0] bis buffer[3]). Und einer meiner wilden Eintrage im Enum (message_code) den Wert 70 hat, dann ergibt das

    message_code = *(messages_code_type *) buffer;
    

    den Wert 70.

    Gruß
    Franky



  • Enums haben nur zur Compilierzeit eine Bedeutung. Danach sind es einfach nur stumpfe ints. Ob du also so einen wertigen Enum-Eintrag hast ist vollkommen egal.


  • Mod

    Damit das nochmal klar wird, hier ein kleines Testprogramm an dem du rumspielen kannst:

    #include<iostream>
    using namespace std;
    enum message_code_type{null,eins,zwei,drei};
    
    int main()
    {
      char buffer[8]={1,0,0,0,34,24,34,85};
      message_code_type message_code;
      message_code = *(message_code_type*) buffer;
      cout<<message_code<<endl;  
    }
    

    Was sieht man an dem Programm?
    1. Was in dem enum steht ist völlig egal.
    2. Sofern sizeof(int) bei dir kleiner oder gleich 4 ist, werden die hinteren 4 chars vollkommen ignoriert. Auf den üblichen Systemen ist sizeof(int)=4.
    3. Wie die ersten 4 Bytes interpretiert werden, ist eine Sache wie ints auf deinen Computer gespeichert werden. Auf einem x86-Prozessor sollte mein Beispielprogramm die Ausgabe 1 erzeugen. Wenn du das gleiche Programm auf einem älteren Apple-Computer ausführst (als sie noch PowerPC Prozessoren verwendet haben), dann dürfte die Ausgabe 16777216 sein.

    (Erklärung: 16777216 = 2^24. Für weitere Information informiere man sich über den Begriff Endianess.)



  • Danke!

    ich denke jetzt ist es klar geworden. 👍

    Gruß
    Franky


Anmelden zum Antworten