Dezimal zu Hexadezimal



  • Hallo,

    ich habe ein Problem bei einer Funktion, die eine Dezimalzahl von 0-255 in eine
    zwei-Stellige Hexadezimalzahl umwandeln soll: Es handelt sich um einen Dubug Error. Ich habe schon über Google herausgefunden, dass es sein könnte, dass ich über den Speicher hinausschreibe (warscheinlich bei dem Array). Ich habe ihn leider noch nicht finden können. Hier ist mein Quellcode: (ist warscheinlich wieder mal viel zu komliziert)

    #include <iostream>
    #include <cstring>
    #include <cstdlib>
    using namespace std;
    
    void DezToHex (int decimal, char* buffer[2])
    {
    	if ((decimal > 255) || (decimal < 0))
    		exit (0);
    
    	double teiler = decimal/16;
    	double zweiteZahl = teiler-static_cast <int> (teiler);
    
    	if (teiler > 9)
    		buffer[1] = static_cast <int> (teiler) + 55;
    	else
    		buffer[1] = static_cast <int> (teiler) + 48;
    
    	if (static_cast <int> (zweiteZahl) * 16 > 9)
    		buffer[2] = static_cast <int> (zweiteZahl) * 16 + 55;
    	else
    		buffer[2] = static_cast <int> (zweiteZahl) * 16 + 48;
    }
    
    int main ()
    {
    	char* red[2];
    	int decimal_red;
    	cout <<"Geben Sie die Farbintensitaet fuer Rot ein (0-255).";
    	cin >>decimal_red;
    	DezToHex (decimal_red, red);
    
    	char* green[2];
    	int decimal_green;
    	cout <<"Geben Sie die Farbintensitaet fuer Gruen ein (0-255).";
    	cin >>decimal_green;
    	DezToHex (decimal_green, green);
    
    	char* blue[2];
    	int decimal_blue;
    	cout <<"Geben Sie die Farbintensitaet fuer Blau ein (0-255).";
    	cin >>decimal_blue;
    	DezToHex (decimal_blue, blue);
    
    	cout <<"Die Hexadezimalzahl heisst: #" <<red <<green <<blue;
    }
    


  • da ist der fehler:

    C++H schrieb:

    buffer[2]

    (zeile 20 und 22)

    mfg,
    andi01.



  • Ersteinmal folgendes:

    double teiler = decimal/16; //Wenn du wirklich double möchtest, dann durch 16.0 teilen
    

    Der Feheler liegt darin, dass du auf Buffer[1] und Buffer[2] zugreifst.
    Buffer hat aber nur 2 Elemente. Diese sind Buffer[0] und Buffer[1]. Buffer[2] wäre ein drittes Element (Indices fangen bei 0 an).
    Das ganze kannst du deutlich abkürzen, wenn du std::string und std::stringstream benutzt:

    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    string Umwandeln(int eingabe)
    {
       if( eingabe < 0 || eingabe > 255)
           exit(0);
    
       stringstream Str;
       Str << hex << eingabe; //umwandeln der Zahl in einen String im hex format
       return Str.str();  //string zurück geben
    }
    
    int main()
    {
       int einhabe_rot;
       int eingabe_gruen;
       int eingabe_blau;
       cout <<"Geben Sie die Farbintensitaet fuer Rot ein (0-255).";
       cin >>eingabe_rot;
       cout <<"Geben Sie die Farbintensitaet fuer gruen ein (0-255).";
       cin >>eingabe_gruen;
       cout <<"Geben Sie die Farbintensitaet fuer blau ein (0-255).";
       cin >>eingabe_blau;
    
       cout <<"Die Hexadezimalzahl heisst: #" << Umwandeln(eingabe_rot) << Umwandeln(eingabe_gruen) << Umwandeln(eingabe_blau);
    }
    


  • Nachtrag:
    Um sicher zu gehen, dass es imemr Genau zwei Stellen sind (führende Nullen werden weggelassen) kannst du auch folgendes Schreiben:

    stringstream Str;
    Str << setfill ('0') << setw (2); //immer mind. 2 Zeichen lang
    Str << hex << eingabe; //umwandeln der Zahl in einen String im hex format
    return Str.str();  //string zurück geben
    


  • Vielen Dank an euch alle. Da habe ich mal wieder vergessen bei 0 anzufangen, so ein Mist!


Anmelden zum Antworten