double a -> char array[sizeof(double)] ???



  • -Also wie man das mit memcpy macht ist mir auch klar.
    Das hat schon jemand vor dir empfohlen und ich halte es auch mit für die beste Lösung.
    -Aber ich will ja auch was lernen.
    -Wiso das auf einem Rechner schief gehen soll ist mir nicht klar.
    (Würd mich über eine erklärung freuen)(Ich glaub das im Übrigen auch nicht wenn dus nicht begründest)
    (Zumal das Programm getestet ist und bei mir sehr gut läuft).
    -Unportabel zu anderen rechnern Meinst du wegen Big und Littel Endian ??
    -Kannst du mir die Aliasing Regel erklären ?? Die kenne ich nicht.
    (Gehts darum, dass ich die Blockgröße verletze,
    wenn sizeof(ptr_type a) den datenblock auf den es zeigt nicht ohne Rest teilt ??)Wenn ja ists trivial
    (-Aliasing kenne ich nur aus Nachrichtentechnik)
    -Die neuste version des codes schaut bereits so aus:

    AlexXXx schrieb:

    double x=0.999;
    
        char *x_ptr=reinterpret_cast<char *>(&x);
        unsigned char ar[sizeof(x)];
    
        std::cout <<"\nx " <<x;
    
        for(unsigned int count=0;count<sizeof(x);count++)
            ar[count]=*(x_ptr+count) ;
    
        x=0;
    
        for(int count=sizeof(x)-1;count>=0;count--)
            *(x_ptr+count)|=ar[count];
    
        std::cout <<"\nx " <<x;
    


  • Werdet ihr echt für eure Antworten bezahlt, oder gute deutsche Hilfsbereitschaft??
    *ggg*
    Würd mich interessieren.
    Gruß



  • AlexXXx schrieb:

    -Wiso das auf einem Rechner schief gehen soll ist mir nicht klar.

    Du greifst auf einen int über einen char* zu. Hier spielt die Byte-Ordnung eine Rolle und wieviel Bits ein Byte besitzt. Die ist nicht auf jedem Rechner gleich. Dann setzt Du den int wieder aus bytes manuell zusammen über << und + oder |. Dabei nimmst Du an, dass Bytes 8 Bits besitzen und ein int im Little-Endian Format abgelegt ist. Auf einer Big-Endian-Maschine oder auf einer, die zB 16Bit-Bytes benutzt, kommt bei Dir Murks raus.

    AlexXXx schrieb:

    -Unportabel zu anderen rechnern Meinst du wegen Big und Littel Endian ??

    Ja, und auch, was die Größe von ints angeht (16 bit? 24 bit? 32 bit? 64 bit?...)

    AlexXXx schrieb:

    -Kannst du mir die Aliasing Regel erklären ?? Die kenne ich nicht.
    (Gehts darum, dass ich die Blockgröße verletze,
    wenn sizeof(ptr_type a) den datenblock auf den es zeigt nicht ohne Rest teilt ??)Wenn ja ists trivial
    (-Aliasing kenne ich nur aus Nachrichtentechnik)

    GIYF, strict aliasing

    AlexXXx schrieb:

    -Die neuste version des codes schaut bereits so aus:

    Pfui bah!
    - Du greifst über char* zu und speicherst in unsigned char 👎
    - Du gehst davon aus, dass wenn Du x=0 setzt, alle Bits 0 sind 👎
    - Du benutzt nicht std::memcpy 👎

    AlexXXx schrieb:

    Werdet ihr echt für eure Antworten bezahlt, oder gute deutsche Hilfsbereitschaft??

    Bezahlt? Nein. Deswegen solltest Du darauf achten, dass Du nicht unnötig Kapazität an Hilfsbereitschaft aufbrauchst. Statt so viele Fragen zu stellen, kannst Du Dir auch einfach 2-3 schlaue Bücher besorgen, und Internetsuchmaschinen benutzen. Das mit den Büchern lohnt sich -- auch für Dich.

    Gruß,
    SP



  • @SebastianP
    -Zunächt mal danke für kompetente Antwort. Hat mir weiter geholfen.
    -memcpy benutze ich nicht, weil ich ganz zu anfang gschrieben habe, dass ich
    eigentlich eine Funktion aufrufen will. Also:

    write(char *,int size,......)
    

    wenn ich memcpy verwenden möchte, müßte ich ja

    int x; //zu schreibende Wert
    unsigned char *x_ptr[sizeof(x)];
    memcpy(....);    //x nach x_ptr glaub es war (destination,target,size) bin zu faul nach zu schauen
    write(x_ptr,sizeof(x),...);
    

    schreiben.
    Mit der anderen Variante stell ichi mir das so vor:

    int x;
    unsigned char x_ptr=einterpret_cast<unsigned char *>(&x); 
    write(x_ptr,sizeof(x),...);
    

    Wegen bücher. 🙂 "auch". Also wenn ich Bücher lese, lerne ich eigentlich immer was dazu. Mach das eigentlich ganz gern. Mein C und C++ ist weit davon entfernt ausgereift zu sein, und das wird wahrscheinlich auch immer so bleiben.
    Bücher würdest du die auf deiner Homepage empfahlen denke ich??
    Hatte mit Büchern in C++ bis jetzt nur Pech.
    habe mir C++ von A bis Z gekauft 😞
    Und mein erstes war Praktische C++ Programmierung von O'Reilly.
    Gruß



  • AlexXXx schrieb:

    @SebastianP
    -Zunächt mal danke für kompetente Antwort. Hat mir weiter geholfen.
    -memcpy benutze ich nicht, weil ich ganz zu anfang gschrieben habe, dass ich
    eigentlich eine Funktion aufrufen will. Also:

    write(char *,int size,......)
    

    wenn ich memcpy verwenden möchte, müßte ich ja

    int x; //zu schreibende Wert
    unsigned char x_ptr[sizeof(x)];
    memcpy(....);    //x nach x_ptr glaub es war (destination,target,size) bin zu faul nach zu schauen
    write(x_ptr,sizeof(x),...);
    

    schreiben.
    Mit der anderen Variante stell ichi mir das so vor:

    int x;
    unsigned char *x_ptr=einterpret_cast<unsigned char *>(&x); 
    write(x_ptr,sizeof(x),...);
    

    Wegen bücher. 🙂 "auch". Also wenn ich Bücher lese, lerne ich eigentlich immer was dazu. Mach das eigentlich ganz gern. Mein C und C++ ist weit davon entfernt ausgereift zu sein, und das wird wahrscheinlich auch immer so bleiben.
    Bücher würdest du die auf deiner Homepage empfahlen denke ich??
    Hatte mit Büchern in C++ bis jetzt nur Pech.
    habe mir C++ von A bis Z gekauft 😞
    Und mein erstes war Praktische C++ Programmierung von O'Reilly.
    Gruß



  • Was mich noch interessiern würd wäre:

    Sebastian schrieb:

    Ja, und auch, was die Größe von ints angeht (16 bit? 24 bit? 32 bit? 64 bit?...)

    Ich dachte dass egal auf welcher Maschine char jeden
    Typen (Also gleitkomma oder ganzzahl)
    Ohne Rest teilen müßte.
    Folglich dürfte das bei der letzten Lösung keine Rolle spielen.
    (Big und little Endian ist nach wie vor ein Problem. Aber für mich zunächst uninteressant.)
    Der << akzeptiere ich als schrott.



  • AlexXXx schrieb:

    Mir ist zu spät aufgefallen, dass ich in dem Codeabschnitt in dem ich mich gerade befinde keinen speicher mehr anfordern darf. Wenn ich std::stringstream richtig initialisiere, glaube ich trotzdem, dass die Methode c_str() neuen braucht.

    Könntest du mal bitte sagen, wieso?
    Welche Werte bekommst du denn und wieso musst du sie wo genau speichern? Wieso bist du dir so sicher, dass du da überhaupt c_str() brauchst?
    Und wieso darfst du keinen Speicher mehr anfordern?

    bb



  • Also es funktioniert einwandfrei nach der zuletzt entwickelten Methode.
    Schief gehen würde es meiner Meinung nach lediglich, wenn char
    einen Typen nicht ohne Rest teilt. (Abgesehen von dem Little und Big endian Problem)
    Und da bin ich der Auffassung, daß das nicht sein darf.
    Gruß


Anmelden zum Antworten