Hilfe beim arbeiten mit Feldern



  • So würde ich das lösen, wenn die Aufgabenstellung wäre:
    Verwende nur den iostream:

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char Binaer[7];
        int Dezimal;
        int E0,E1,E2,E3,E4,E5,E6,E7;
        do{
            cout<<"8 Bits eingeben: ";
            cin>>Binaer;
            cout<<Binaer[0]<<Binaer[1]<<Binaer[2]<<Binaer[3]
                <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl;
        }while((Binaer[0] != '0' && Binaer[0] != '1')
                ||(Binaer[1] != '0' && Binaer[1] != '1')
                ||(Binaer[2] != '0' && Binaer[2] != '1')
                ||(Binaer[3] != '0' && Binaer[3] != '1')
                ||(Binaer[4] != '0' && Binaer[4] != '1')
                ||(Binaer[5] != '0' && Binaer[5] != '1')
                ||(Binaer[6] != '0' && Binaer[6] != '1')
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
    
        if (Binaer[7] == '1')
            E7 = 1;
        else
            E7 = 0;
    
        if (Binaer[6] == '1')
            E6 = 2;
        else
            E6 = 0;
    
        if (Binaer[5] == '1')
            E5 = 4;
        else
            E5 = 0;
    
        if (Binaer[4] == '1')
            E4 = 8;
        else
            E4 = 0;
    
        if (Binaer[3] == '1')
            E3 = 16;
        else
            E3 = 0;
    
        if (Binaer[2] == '1')
            E2 = 32;
        else
            E2 = 0;
    
        if (Binaer[1] == '1')
            E1 = 64;
        else
            E1 = 0;
    
        if (Binaer[0] == '1')
            E0 = 128;
        else
            E0 = 0;
    
        Dezimal = E7+E6+E5+E4+E3+E2+E1+E0;
        cout<<"Die Dezimalzahl ist: "<<Dezimal<<endl;
    
        return 0;
    }
    


  • @theAnfänger77
    Du weißt wie man Schleifen benutzt?
    Die ganze Kaskade kann man ohne Hilfsvariablen in einer einzigen Schleife lösen.

    1. Initialisiere das Ergebnis mit 0
    2. für jedes Zeichen im String:
      - Schiebe Ergebnis 1 bit nach links
      - setze Bit 0 im Ergebnis, falls das aktuelle Zeichen eine '1' ist


  • @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.



  • An die Anfänger/Neulinge:
    bitte kompiliert euren Code immer mit eingeschalteten Warnungen!

    Wenn ich den Code von @theAnfänger77 kompiliere, ergibt sich:

    $ clang++-7 -Wall -Wextra forum.cpp                   
    forum.cpp:14:48: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                <<Binaer[4]<<Binaer[5]<<Binaer[6]<<Binaer[7]<<endl;
                                                   ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:22:16: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
                   ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:22:36: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
                ||(Binaer[7] != '0' && Binaer[7] != '1'));
                                       ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    forum.cpp:24:9: warning: array index 7 is past the end of the array (which contains 7 elements) [-Warray-bounds]
        if (Binaer[7] == '1')
            ^      ~
    forum.cpp:7:5: note: array 'Binaer' declared here
        char Binaer[7];
        ^
    4 warnings generated.
    

    Also - so funktioniert es nicht. Vergesst am Anfang erst einmal die Arrays und nehmt stattdessen std::string für Char-Arrays und std::vector für alle anderen Array-Typen. Ich verwende in C++ praktisch überhaupt keine C-Style-Arrays.


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    @theAnfänger77 sagte in Hilfe beim arbeiten mit Feldern:

    char Binaer[7];

    Das ist ja noch schlimmer als die Lösung von @RBS2.

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?

    Herrgott noch mal...

    std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
    std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;
    

    😆

    Ich schwöre, ich poste hier gleich die fertige Lösung, damit hier endlich Ruhe ist....



  • @RBS2 sagte in Hilfe beim arbeiten mit Feldern:

    Was sagt der große Meister dazu?

    char Binaer[8];
    cin >> setw(8) >> Binaer;
    

    Immer noch Buffer Overflow?

    Wieviele Bits kann man da jetzt eingeben?

    Aber warum sollte man eine einfache Lösung verwenden, wenn man sich doch mit char-Arrays auf unendlich vielen Wegen in den Fuß schießen kann?


  • Gesperrt

    @manni66 sagte in Hilfe beim arbeiten mit Feldern:

    Wieviele Bits kann man da jetzt eingeben?

    Ich seh's schon. Es wird wieder eine überflüssige Null angehängt. 😭


  • Gesperrt

    @It0101 sagte in Hilfe beim arbeiten mit Feldern:

    Herrgott noch mal...
    std::string ScheissEgalWievieleZeichenVerdammtNochMal = "";
    std::cin >> ScheissEgalWievieleZeichenVerdammtNochMal;

    Der Herrgott kann nichts dafür. Das war bestimmt der Teufel, der 'cin' auch char-Arrays befüllen lässt.



  • Ach du heilige... ^^
    Zerfleischt euch jetzt nicht wegen einer Anfängerfrage.



  • So ungefähr würde wohl eine halbwegs gescheite Lösung aussehen. Um das Thema hier mal zu beschließen 😉

    int main( int argc, char **argv )
    {
        unsigned long long Dezimal = 0;
        // Zahl eingeben
        std::cout << "Gib eine Binaerzahl ein, beginnend mit dem niederwertigsten Bit: ";
        std::string Binaer = "";
        std::cin >> Binaer;
    
        // Bits berenzen
        if ( Binaer.size() > sizeof( Dezimal  ) * 8 )
        {
            std::cout << "Zuviele Bits fuer Zieldatentyp\n";
            return 0;
        }
    
        // Eingabe ueberpruefen
        for ( const char &bit : Binaer )
        {
            if ( bit != '0' && bit != '1' )
            {
                std::cout << "Binaerzahlen duerfen nur aus 0 oder 1 bestehen\n";
                return 0;
            }
        }
        std::cout << "Binaerzahl erfolgreich eingelesen\n";
    
        // Umrechnen in
        unsigned long long BitValue = 1;
        for ( const char &bit : Binaer )
        {
            if ( bit == '1' )
                Dezimal |= BitValue;
            BitValue = BitValue << 1;
        }
    
        std::cout << "Binaerzahl " << Binaer << " ins Dezimalsystem umgerechnet ergibt " << Dezimal << "\n";
        return 0;
    }
    


  • Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor?
    Und warum steht das niederwertigste Bit am Anfang des strings und nicht am Ende?
    😆


  • Gesperrt

    @DocShoe sagte in Hilfe beim arbeiten mit Feldern:

    Warum die explizite Zuweisung in Zeile 5? Das erledigt doch schon der Konstruktor? 😆

    Für den C++ noob könnte so der Eindruck enstehen, 'cin' würde die Eingabe an den String anhängen.