Ein echter WTF.

Es gibt so Tage, da schaemt man sich einfach fuer seine Zunft. Frisch als Diplom Informatiker in Ehren von der Uni gekegelt muss man Code lesen, der ungefaehr so aussieht wie der Folgende. (Und wer sich wiedererkennt, um den tut es mir echt nicht leid!)


/* convert  Hex-String into an integer */
int HexTextToInt(string ToConvert)
{
        int iToReturn = 0;
        int iExp = 0;
        char chByte;

        // The string to convert is empty
        //
        if(ToConvert == "")
               return 0;
        // The string have more than 8 character (the equivalent value
        // exeeds the DWORD capacyty
        //
        if(ToConvert.length() > 8 )
                return 0;

        try
        {
        // We calculate the number using the Hex To Decimal formula
        //
        for(int i= ToConvert.length()-1; i >= 0; i--){
                chByte = ToConvert[i];
                switch(int(chByte)){
                        case 65:
                                iToReturn += 10*pow(16.0f,iExp);
                                break;
                        case 66:
                                iToReturn += 11*pow(16.0f,iExp);
                                break;
                        case 67:
                                iToReturn += 12*pow(16.0f,iExp);
                                break;
                        case 68:
                                iToReturn += 13*pow(16.0f,iExp);
                                break;
                        case 69:
                                iToReturn += 14*pow(16.0f,iExp);
                                break;
                        case 70:
                                iToReturn += 15*pow(16.0f,iExp);
                                break;
                        default:
                                if((int(chByte) <48)||(int(chByte)>57))
                                return -1;
                        iToReturn += atoi(&chByte)*pow(16.0f,iExp);
                        break;
                        }
                iExp++;
                }
        }
        catch(...)
        {
                // Error, return 0
                //
                return 0;
        }

        return iToReturn;
}

Viele Leute vergnuegen sich ja gerne an trivialsten Programmierproblemen wie diesem hier oder diesem. Aber in meinen Augen ist das ein geloestes Problem, dass man sich mit dem Arsch nicht mehr ansieht.
Und wenn doch, dann doch bitte richtig.

Also starte ich mal folgenden Aufruf.

Schreibt ein Programm in der Programmiersprache eurer Wahl (Ja, auch LOLCode, Brainfuck, Malbolge oder Perl), welches obiges Trivialproblem loest. Eingabe ist ein String in dem sich eine Hex Zahl in ASCII Darstellung befindet (ohne fuehrende 0x oder aehnliches). Man kann annehmen, dass der String vorher vollstaendig in Lowercase konvertiert wurde. Ebenfalls nehmen wir an, dass es sich um Vorzeichenbehaftete 32 bit Zahlen handelt (was obiger Code natuerlich nebenher auch noch falsch macht, wer weiss, warum bekommt n Gummipunkt).

Edit: Natuerlich war es so gemeint, dass man keine bibliotheksfunktionen fuer die konvertierung nutzen soll

Wer noch mehr WTFs findet darf sie natuerlich in den Kommentaren anmerken. Spontan finde ich viele.

(Ich entschuldige mich schonmal fuer die kaputte Formatierung, werd mich nacher mit Tod drum pruegeln das ordentlich hinzubekommen.)

~ von profmakx am 07.07.2008.

7 Antworten to “Ein echter WTF.”

  1. In Perl:

    $integer = hex($hextstring);

    Damit wäre das Problem genug mit dem Arsch angekuckt. Man kann sowas im ersten oder zweiten Semester als Progammierübung schon mal selbst bauen, danach sollte man aber gelernt haben, auf eingebaute Funktionen und Bibliotheken zurückzugreifen. Sonst kommt man ja nie zum Ziel, wenn man mal was größeres schreiben muss.

  2. Dein Programm funktioniert nicht wie gefordert. (Und ich meine nicht die Ergaenzung zur Aufgabenstellung).

  3. Nunja, wenn Du es als vollständiges Programm willst, dann hilft Dir auf der Kommandozeile:
    perl -wne ‘chomp; print hex;’
    Wobei ja nicht spezifiziert ist, wie die Schnittstelle aussehen soll. Hier funktioniert sie über STDIN/STDOUT.

  4. Deine Funktion tut trotzdem nicht das, was gefordert ist ;).

  5. Wenn man bereits erfahren hat welche Probleme du meinst, scheint es offensichtlich.
    Wie bereits gesagt halte ich das aber auch teilweise mit dain begründet dass jemand beim design von C (und allen möglichen anderen Sprachen die das durch die Bank alle übernommen haben) etwas faul war und größeren Aufwand beim Compiler-schreiben vermeiden wollte.
    Die Ausweichmöglichkeiten scheinen mir bei den bekannten Sprachen alle nicht ideal.

  6. Du kennst Haskell also nicht *duckundweg*

  7. hab mich nicht damit beschäfftigt… und würde es auch nicht unbedingt unter “bekannte Sprache” einordnen.
    BTW: auch in x86-asm würde ich das anders lösen
    MUHAHAHAHAHA

Einen Kommentar schreiben