Dezimalzahlen umwandeln in Hexadezimalzahlen und Binärzahlen



  • Hallo,

    kann mir vielleicht bitte jmd erklären, was an dem Code Falsch ist.

    Es kommt die Fehlermeldung: "to_dec was not declared in this scope"

    Prinzipiell müsste es doch funktionieren, also auch mit der Übergabe der Adresse "&y". 🙂

    #include <iostream>
    #include <stdio.h>

    using namespace std;

    int main()
    {
    int x;
    cout << "Geben Sie eine Dezimalzahl ein " << endl;
    cin >> x;

    cout << "Die Dezimalzahl ist:" << ausgabe(to_dec(x)) << endl;
    cout << "Die Binärzahl ist:" << ausgabe(to_bin(x)) << endl;
    cout << "Die Hexadezimalzahl ist:" << ausgabe(to_hex(x)) << endl;
    }

    int to_dec(int x)
    {
    for (int i=0; i<8; i=i+1)
    {
    int y[8];
    y[i] = '0' + x%10;
    x = x / 10;
    }
    return &y;
    }

    int to_bin(int x)
    {
    int y[8]
    for(int i=0; i<8; i=i+1)
    {
    y[i] = '0' + x%2;
    x = x / 2;
    }
    return &y;

    }

    int to_hex(int x)
    {
    int y[8]
    for (int i=0; i<8; i=i+1)
    {
    int help= x%16;
    if (help < 10)
    y[i] = '0' + help;
    else
    y[i] = 'A' + help-10;
    x = x /16;
    }
    return &y; //übergibt vom Feld y die Adresse des ersten Feldstücks
    }

    int ausgabe(int y){ //du bekommst die (anfangs-)Adresse vom Feld y
    cout << *y << endl; //Wert an der Adresse y
    y++; //Pointer um die länge eines ints verschieben
    //auf nächsten int-Wert des Feldes y

    }



  • Du musst to_dec und to_bin vor der verwendung bekannt machen.

    Schreib einfach vor main

    int to_dec(int x);
    int to_bin(int x);
    int to_hex(int x);
    

    Genaueres findest du bei Google mit dem Stichwort forward-declaration

    Nächstes mal bitte Code-tags



  • Hey, danke!

    jetzt kommt die Fehlermeldung: "invalid conversion from 'int (*)[8]' to 'int'"

    Sorry, wär klasse wenn du kurz schrieben könntest was da nicht ganz stimmt,
    ich hab gemeint ich hab das richtig gemacht mit dem zeiger und der Adresse übergeben..

    Der Code müsste jetzt lesbarer aussehen:

    #include <iostream>
    #include <stdio.h>
    
    using namespace std;
    
    int to_bin(int x);
    int to_hex(int x);
    int to_dec(int x);
    
    int main()
    {
    
           int x;
           cout << "Geben Sie eine Dezimalzahl ein " << endl;
           cin >> x;
    
           cout << "Die Dezimalzahl ist:" << ausgabe(to_dec(x)) << endl;
           cout << "Die Binärzahl ist:" << ausgabe(to_bin(x)) << endl;
           cout << "Die Hexadezimalzahl ist:" << ausgabe(to_hex(x)) << endl;
    }
    
    int to_dec(int x)
    {   int y[8];
        for (int i=0; i<8; i=i+1)
        {
    
            y[i] = '0' + x%10;
            x = x / 10;
        }
        return &y;
    }
    
    int to_bin(int x)
    {
        int y[8];
        for(int i=0; i<8; i=i+1)
        {
            y[i] = '0' + x%2;
            x = x / 2;
        }
        return &y;
    
    }
    
    int to_hex(int x)
    {
        int y[8];
        for (int i=0; i<8; i=i+1)
        {
            int help= x%16;
            if (help < 10)
                y[i] = '0' + help;
            else
                y[i] = 'A' + help-10;
            x = x /16;
        }
        return &y;           //übergibt vom Feld y die Adresse des ersten Feldstücks
    }
    
    int ausgabe(int y){    //du bekommst die (anfangs-)adresse vom Feld y
        cout << *y << endl; //Wert an der adresse y
        y++;                //Pointer um die länge eines ints verschieben
                            //auf nächsten int-Wert des feldes y
    
    }
    


  • Zeile der Fehlermeldung?

    Ich tippe jetzt einfach mal auf Zeile 63.
    Dort übergibts du der Funktion, die nebenbei auch vor main noch bekannt gemacht werden muss, ein Kopie der Variable und keinen Pointer. Deswegen schlägt der aufruf von *y fehl. Auch bringt y++ nichts da die varaible y nach ende der Funktion gelöscht wird.



  • Warum nimmst du an, dass ein int dasselbe sein könnte wie die Adresse von irgendwas?



  • Benutzerjulfes schrieb:

    int to_hex(int x)
    {
        int y[8];
    ...
        return &y;           //übergibt vom Feld y die Adresse des ersten Feldstücks
    }
    

    1. Der Rückgabetyp der Funktion (int) stimmt nicht mit dem Typ bei return überein (Die Adresse auf ein int[8])
    (Das meckert der Compiler an)

    2. Unmittelbar nach dem return ist y aber nicht mehr gültig.
    Damit greifst du in der rufenden Funktion auf ungültigen Speicher zu.

    Völlig falsches herangehen.
    Wenn du etwas in ein char-Array schreiben möchtest, dann musst du die Adresse des Arrays an die Funktion mit übergeben (und die Länge auch).

    Das ist aber alles C.
    Du schreibst C++. Dann nimm std::string


Log in to reply