char buffer in Float-Variable speichern



  • Hallo zusammen,

    ich bekomme über einen Bus 4 Bytes in einem Buffer geliefert. Diese repräsentieren eine Float-Zahl. Ich möchte diese 4 Bytes wieder in einer Variable vom Typ Float speichern. Wäre es eine Ganzzahl, würde folgendes funktionieren:

    long zahl = buffer[0] + (buffer[1] << 😎 + (buffer [2] << 16) + (buffer[3] << 24);

    Für Floatzahlen funktioniert das so leider nicht. Der Compiler (gcc) meckert. (Falls das wichtig ist: ich arbeite mit Linux).

    Kann mir hier jemand einen Trick verraten, wie das trotzdem geht? Habe auch schon so was probiert:

    char * char_ptr = &Float_Zahl

    *char_ptr = buffer[0];
    *(char_ptr++) = buffer[1];
    *(char_ptr++) = buffer[2];
    *(char_ptr++) = buffer[3];

    hier stört sich zwar der Compiler nicht dran, aber Float_Zahl hat danach den Wert 0. Für mich nicht nachvollziehbar. Für Euch? Bin um jede Hilfe dankbar!

    Viele Grüße,

    bierbauch



  • 1. Hast du Endian-ness beachtet?
    2. Dein Code enthält Fehler:

    char * char_ptr = &Float_Zahl
    
    *char_ptr = buffer[0];
    *(char_ptr++) = buffer[1]; // Fehler!!!
    *(char_ptr++) = buffer[2];
    *(char_ptr++) = buffer[3];
    

    Zuerst wird nämlich der Wert von char_ptr (die Adresse, auf die es zeigt genommen), dereferenziert und in die Adresse, auf die char_ptr zeigt, der Wert reingeschrieben, ANSCHLIESSEND dann char_ptr um 1 erhöht.

    Wenn du dich nicht mit C auskennst, dann mach bitte keine solchen Spielereien, sondern schreib einfach ordentlich die Zeile mit Fehler (und die 2 folgenden) stattdessen so, wie es sich für Anfänger gehört:

    char_ptr++;
    *char_ptr = buffer[1];
    

    Wenn du dann den Unterschied zwischen Pre- und Postinkrement in einer fernen Zukunft verstanden hast, dann (aber erst dann!), darfst du es folgendermaßen schreiben:

    *(++char_ptr) = buffer[1];
    

Anmelden zum Antworten