sprintf() schuld ?



  • Das ist eine Hilfsfunktion für einen Dez-Hex-Umwandler.
    Der Code wird zwar compiliert, aber er verändert im Hauptprog die Variable 'num'.
    Woran liegt das ?

    char numToChar(int num)
    {
     char ch;
     switch(num)
     {
      case 10: ch='A';break;
      case 11: ch='B';break;
      case 12: ch='C';break;
      case 13: ch='D';break;
      case 14: ch='E';break;
      case 15: ch='F';break;
      default: sprintf(&ch, "%d", num);
     }
     return ch;
    }
    


  • sprintf() schlägt fehl, weil es einen String erwartet. Mit &ch simmulierst Du das zwar recht gut, ist aber trotzdem falsch .. :))

    Meine Empfehlung - statt dem sprintf() schreib

    default: ch = num + '0';
    


  • Wenn Du's noch einfacher haben willst, geht auch dieser Code:

    char ToHex(int i)
    { return (i&0xF)["0123456789ABCDEF"]; }
    


  • /me reibt sich die Augen!



  • Original erstellt von Bitsy:
    /me reibt sich die Augen!

    Warum?



  • Na gut, "0123456789ABCDEF"[i&0xF]; geht ja auch (und sieht schon bescheuert genug aus).
    Aber das Verdrehen von Index und Feld wird mir immer suspekt bleiben.



  • Original erstellt von Bitsy:
    ... Aber das Verdrehen von Index und Feld wird mir immer suspekt bleiben.

    Naja -- die Sache ist eigentlich recht einfach. Aus

    a[i] = x;
    

    macht der Compiler

    *(a+i) = x;
    

    und man kann dann auch schreiben

    *(i+a) = x;
    

    somit sind wir bei

    i[a] = x;
    


  • Mady, das ist schon klar.
    Ich stimme sogar zu, dass es recht elegant ist.
    Aber Derartiges kommt so selten vor, dass man (okay, ich) beim schnellen Überfliegen einer Source grundsätzlich unnötigerweise an so einer Stelle hängenbleibt und erst einmal grübelt. Typische Stelle für einen kleinen Kommentar mit Smiley.



  • Original erstellt von Bitsy:
    Mady, das ist schon klar.
    Ich stimme sogar zu, dass es recht elegant ist.
    Aber Derartiges kommt so selten vor, dass man (okay, ich) beim schnellen Überfliegen einer Source grundsätzlich unnötigerweise an so einer Stelle hängenbleibt und erst einmal grübelt. Typische Stelle für einen kleinen Kommentar mit Smiley.

    Da stimme ich Dir zu. Ich kenne einige Programmierer, die zwar Software in C schreiben, aber in C richtig programmieren können sie nicht so recht 😉

    Grundsätzlich sollte man natürlich von solchen Tricks abstand nehmen, weil gerade in Unternehmen, wo mehrere Leute an einem Projekt arbeiten, der Wissensstand recht unterschiedlich sein kann. Kommentare helfen dann u.U. auch nicht wirklich weiter.



  • Also, das Wissen um dieses Feature ist nun wirklich nicht nötig. IMHO gehört es sogar explizit verboten - sprich, der der es nutzt kriegt den Rüffel, wenn es eine Rückfrage gibt. Dies ist sicher kein Maßstab für 'programmieren können'.
    Ein einfacher const char* hexdigits täte es auch, ohne dass sich am erzeugten Code was ändern würde.



  • Sicherlich .... deswegen schrieb ich ja auch, dass man solchen Code nicht unbedingt verwenden sollte, wenn *mehr* dranhängt.

    Aber: Wenn jmd. in C programmiert (für Geld), dann sollte er zumindest mit Pointern und ähnlich komplexen Konstrukten umgehen können. Das ich als Programmierer meine Sprache gut beherrsche, ist für mich sehr wohl ein Maßstab für "programmieren können".



  • Ich sage Dir ganz ehrlich, ich hätte mir jederzeit zugetraut eine Art funktionierenden C-Interpreter schreiben zu können. Aber an dieser Stelle wäre der 'Syntax Error' gekommen. Da hätte ich nicht dran gedacht. 😃


Anmelden zum Antworten