Dez to Hex



  • Hallo,
    ich bin zimlich neu hier.

    ich will als Return Wert den Hexzahl haben aber mein "ret" wert wird jedesmal überschrieben mir fehlt der ansatz dies zu speichern und dann zurück geben.

    (printf kann weg)

    Aufruf zB.:

    val_to_hex(123456);
    
    int val_to_hex(int zahl) {
        char ret[5];
        int quotient = (zahl / 16);
        int rest = (zahl % 16);
    
        if (rest <= 9 && quotient >= 1) {
            printf("%d", rest);
            ret[3] -= rest;
            val_to_hex(quotient);
        }
        else if (rest > 9 && quotient >= 1) {
            printf("%c", ((rest - 10) + 'A'));
            ret[0] = ((rest - 10) + 'A');
            val_to_hex(quotient);
        } else if (quotient <= 0) {
            ret[1] = rest;
            (rest <= 9) ? printf("%d", rest) : printf("%c", ((rest - 10) + 'A'));
            printf("\n");
            return 0;
        }
    }
    


  • 1. nur weil das ding ret heißt, wird es noch lange nicht zurückgegeben.
    2. ist ret eine lokale Variable, die bei jedem Aufruf der Funktion neu anglegt wird und auch am Ende zerstört wird.
    3. darf man demnach keine Zeiger auf lokale Variablen zurück geben
    4. fehlt die Nullterminierung bei ret.

    Nebenbei ist Hex oder Dezimal nur eine andere Darstellung. Der Wert ist immer der Selbe.

    Welches Ergebnis liefert val_to_hex(quotient); zurück?
    Gar keins. Da ist keine Zuweisung.


  • Mod

    Total falscher Ansatz, dazu auch noch falsch umgesetzt.

    Zuerst ein paar Vorüberlegungen:
    Hexadezimal ist eine Darstellung einer Zahl, eine Reihe von Ziffern. Ein int oder anderer Zahlendatentyp speichert den Wert einer Zahl, ganz unabhängig von der Darstellung. Ein int mit Wert Zehn ist Zehn, egal ob du "10" schreibst oder "0xA" oder "0o12" oder "0b1010" oder was weiß ich was.

    Daraus folgt, dass deine Funktion offensichtlich eine Zeichenkette zurück geben muss.

    Zeichenketten kann man in C aber nicht einfach über den Rückgabewert zurück kopieren (da Zeichenketten in C char-Arrays sind und Arrays keine Kopiersematik haben). Daher benutzt man lieber eine Übergabe per Referenz und schreibt in die übergebene Zeichenkette rein.

    Um das alles richtig zu machen, muss man natürlich auch einen Plan haben, was man tut und wie man es technisch umsetzt. Beides scheint nicht vorhanden zu sein. Einerseits gibst du mit printf Sachen aus, andererseits fliegt da noch dieses ret rum, welches einfach sinnlos befüllt wird, ohne irgendwie benutzt zu werden. 😕 Kurz: Was soll die Funktion überhaupt machen?

    Aber: Das alles kann man sich sowieso sparen, denn eine Funktion die all diese Punkte erfüllt gibt es schon: (s)printf.
    http://ideone.com/tOogg



  • SeppJ schrieb:

    Aber: Das alles kann man sich sowieso sparen, denn eine Funktion die all diese Punkte erfüllt gibt es schon: (s)printf.

    Sein Code deckt doch eine Menge Fehler auf.
    Der Code den er um das (s)printf schreiben wird, ist dann auch nicht besser.
    Also sollte er doch seine Funktion zum laufen bekommen damit er lernt und Verständnis für C bekommt.

    SeppJ schrieb:

    ...oder "0o12"...

    Ohne o, nur "012"


  • Mod

    DirkB schrieb:

    SeppJ schrieb:

    ...oder "0o12"...

    Ohne o, nur "012"

    Ist trotzdem der gleiche Wert, nur eine andere Darstellung. :p



  • Das ist mit Klar das man einer Zahl verschieden Datstellen kann.

    das Funktion "val_to_hex" soll eine Dezimalzahl in Hex umwandelen und dies als Hex zurück geben. Diese Daten will ich später in eine Datei speichern.

    char hex_zahl = " ";
    val_to_hex(12345, hex_zahl);
    
    //-----------------------------------------
    
    uint8_t val_to_hex(int zahl, char ret) {
    
        int quotient = (zahl / 16);
        int rest = (zahl % 16);
    
        if (rest <= 9 && quotient >= 1) {
            ret += rest;
            val_to_hex(quotient, ret);
        }
        else if (rest > 9 && quotient >= 1) {
            ret = ((rest - 10) + 'A');
            val_to_hex(quotient, ret);
        } 
        else if (quotient <= 0) {
            ret += rest;
        }
        return ret;
    }
    

  • Mod

    lilhill2002 schrieb:

    Das ist mit Klar das man einer Zahl verschieden Datstellen kann.

    das Funktion "val_to_hex" soll eine Dezimalzahl in Hex umwandelen und dies als Hex zurück geben.

    Eine dieser aussagen ist falsch. Denn du gibst deiner Funktion einen Wert, keine Darstellung im Dezimalsystem.

    Diese Daten will ich später in eine Datei speichern.

    Gibt es einen Grund, nicht fprintf zu benutzen?

    char hex_zahl = " ";
    val_to_hex(12345, hex_zahl);
    
    //-----------------------------------------
    
    uint8_t val_to_hex(int zahl, char ret) {
        
        int quotient = (zahl / 16);
        int rest = (zahl % 16);
    
        if (rest <= 9 && quotient >= 1) {
            ret += rest;
            val_to_hex(quotient, ret);
        }
        else if (rest > 9 && quotient >= 1) {
            ret = ((rest - 10) + 'A');
            val_to_hex(quotient, ret);
        } 
        else if (quotient <= 0) {
            ret += rest;
        }
        return ret;
    }
    

    Woah! tut mir Leid, das so sagen zu müssen, aber dies ist sogar noch schlimmer als der erste Code. Jetzt führst du auch noch einen globalen Zustand ein, zudem kommst du immer mehr durcheinander damit wie Zeichenketten funktionieren und deine Rückgabe von ret ist auch total falsch. Und die oben schon angesprochenen weiteren Fehler sind auch immer noch falsch. Du solltest erst einmal gründlich die Grundlagen von C lernen, da fehlt einfach enorm viel Wissen über die einfachsten Techniken.



  • Dein Code ist seltsam ich denke die Funktion sollte eher so aussehen

    int val_to_hex(int zahl, char *str, size_t size);
    

    val_to_hex ist kein guter name
    zahl ist die zahl die dargestellt werden soll
    str ist das Array in das der String(die Darstellung) reingeschrieben werden soll
    size ist die Größe des Arrays
    der Rückgabewert zB 0:alles ok und -1:Fehler zB array zu klein

    oder wenn du direkt in eine Datei schreibst

    int val_to_hex(int zahl, FILE *output);
    


  • lilhill2002 schrieb:

    das Funktion "val_to_hex" soll eine Dezimalzahl in Hex umwandelen und dies als Hex zurück geben. Diese Daten will ich später in eine Datei speichern.

    Augenscheinlich hast Du die Aufgabe, eine Rekursion zu nutzen und diese willst Du verwenden, um ziffernweise Deinen HEX-Wert zu bekommen.

    Richtig erkannt hast Du, dass Du den HEX-Wert, also die Darstellung einer Zahl als HEX, in einer Zeichenkette speichern musst. Tatsächlich verwendet Du nur ein einzelnes Zeichen. Das kann einen HEX-Wert >15 nicht fassen.

    Irgendwo musst Du dann die eintelnen HEX-Ziffern, die Du ermittelst, zusammen führen. Beachte, dass Du beim Abstieg in dieser Rekusrsion das Pferd von Hinten aufzäumst, Du erhälst die kleinste Stelle zuerst.

    Ciao
    MM


Log in to reply