HEX-Zähler ?



  • Hallo,

    meine Erfahrung in C++ tendiert gegen Null.

    Nun versuche ich einen "HEX-Zähler" zu programmieren,
    der folgendes macht:

    Zählt von 0000 bis FFFF ( Großbuchstaben )
    Ausgabe als String

    Hab schon etwas rumprobiert, aber weit bin ich noch nicht gekommen.
    Warscheinlich geht das auch deutlich einfacher.

    Könnte mir da jemand weiterhelfen?

    #include <iostream>
    #include <iomanip>
    
    using namespace std;
    
    int main()
    {
    int zaehler;
    for (zaehler = 0; zaehler < 65536; zaehler++)
    
    cout << setw(4) << setfill('0') << hex << zaehler << endl;
    
    return 0;
    }
    


  • Die Ausgabe von Formatzeichen wie z.B. 'x' bei der Ausgabe von "0x" oder den Ziffern 'a', ..., 'f' bei hexadezimalen Zahlen kann in Großbuchstaben erzwungen werden. Der entsprechende Manipulator/das Flag lautet uppercase. Mit dem Manipulator nouppercase schaltet man zurück.



  • Vielen Dank, es geht

    Ich hab folgendes geändert:

    cout << setw(4) << setfill('0') << uppercase << hex << zaehler << endl;
    

    Jetzt noch eine ganz blöde Frage:

    Wie bekomme ich das Ergebniss, anstatt auf den Schirm, in eine char-Variable, die ich weiterbearbeiten kann ?



  • Das geht so:

    #include <sstream>
    
    // ...
    std::stringstream stream;
    stream << setw(4) << setfill('0') << uppercase << hex << zaehler << endl;
    std::string s(stream.str());
    


  • Ich hab mal den Code so eingebaut:

    #include <iostream>
    #include <iomanip>
    #include <sstream> 
    
    using namespace std;
    
    int main()
    {
    int zaehler;
    for (zaehler = 0; zaehler < 65536; zaehler++)
    
    std::stringstream stream; 
    stream << setw(4) << setfill('0') << uppercase << hex << zaehler << endl;
    std::string s(stream.str());
    
    return 0;
    }
    

    Bekomme leider Fehlermeldungen:

    test.cpp: In function ‘int main()’:
    test.cpp:13: error: ‘stream’ was not declared in this scope
    

    Nun weis ich nicht was falsch ist.



  • Versuch mal

    #include <sstream>
    


  • Pikkolini schrieb:

    Versuch mal

    #include <sstream>
    

    Hat er doch.

    Edit: Ich verrate es euch. For schleife klammers Scope sind meine Tipps



  • In diesem Fall musst du das std:: weglassen.



  • player424 schrieb:

    In diesem Fall musst du das std:: weglassen.

    Ich weiß nicht ob du meinen Post schon gelesen hast, aber EINRÜCKEN UND KLAMMERSETZEN HILFT hier enorm den Fehler zu sehen!



  • Hmm,
    ich hab jetzt mal rumprobiert ( ohne zu wissen was ich mache 😞 )

    Hab jetzt keine Fehlermeldung mehr, aber auch keinerlei Ausgabe.
    Falls das was ich gemacht habe richtig ist - wo ist jetzt die Variable mit der ich weitermachen kann ?

    #include <iostream>
    #include <iomanip>
    #include <sstream> 
    
    using namespace std;
    
    int main()
    {
    int zaehler;
    for (zaehler = 0; zaehler < 65536; zaehler++)
    {
    stringstream stream; 
    	stream << setw(4) << setfill('0') << uppercase << hex << zaehler << endl;
    string s(stream.str());
    }
    return 0;
    }
    


  • Sicher hast du keine Ausgabe, weil du kein cout machst...
    string s, ist dein Char-Array.

    EDIT: Wie man mit std::string arbeitet kannst du hier nachlesen:
    http://www.cplusplus.com/reference/string/string/



  • Ich danke Euch und werde versuchen mich erfolgreich einzulesen.

    Hab das letzte Mal vor über 20 Jahren in Fortran 77 und GFA-Basic "programmiert" 🕶



  • Ich hab mal nach langer Pause weiterprobiert:

    #include <iostream>
    #include <iomanip>
    #include <sstream> 
    
    using namespace std;
    
    int main()
    {
    float zaehler;
    
    for (zaehler = 0; zaehler < 68719476736; zaehler++)   // fuer 9 stelligen Zaehler
    {
    stringstream stream; 
    	stream << setw(9) << setfill('0') << uppercase << hex << zaehler << endl;
    string s(stream.str());
    cout << "test-"<< s << endl;
    
    }
    return 0;
    }
    

    Das bringt mir eine Fehlermeldung: integer constant is too large for ‘long’ type
    Die Zahl 68719476736 ist offensichtlich zu groß.

    Ich hab für die Variable zaehler Int, float, double und unsigned int probiert,
    aber anscheinend bin ich da auf dem Holzweg



  • [quote="peter1962"]

    68719476736
    

    [/code]
    Hier passiert folgendes:
    Der Compiler sieht eine Zahl. Da die keine Kommata, Suffixe etc. hat, liest er sie als integrale Konstante vom Typ long.
    long ist auf deinem System aber zu klein, um so eine große Zahl aufzunehmen.
    Falls du mit einem Compiler arbeitest, der den Typ long long unterstützt, könntest du ein LL hinten an das Literal hängen.
    Allerdings konvertierst du ja eh in einen Float (warum eigentlich nicht double?), also kannst du auch gleich ein . und ein f anhängen:

    for (zaehler = 0; zaehler < 68719476736.f; zaehler++)   // fuer 9 stelligen
    

    Allerdings hast du dann immernoch 2 Probleme:

    1. Dein Kommentar passt nicht zum Code - die Zahl hat 11 Stellen.
    2. er tut nicht das was du willst. float hat Rundungsfehler (mehr noch als double), deshalb kann es vorkommen, dass x+1 nach der Rundung wieder x ergibt. Du läufst dann in eine Endlosschleife.


  • Wenn ich double benutze bekomme ich:
    integer constant is too large for ‘long’ type

    Ob mein Compiler g++ (Ubuntu 4.4.3-4ubuntu5) 4.4.3 die riesige Zahl verarbeiten kann ist mir unklar.

    Der Kommentar mit den 9 Stellen bezieht sich auf die "fertige" HEX-Zahl



  • Wozu eigentlich float oder double.. Nimm doch einfach das weiter oben verschlagene "long long" als Datentyp und gut ist. 🙂



  • long long zaehler;
    

    gibt wieder

    warning: integer constant is too large for ‘long’ type

    also keine Änderung



  • #include <iostream>
    #include <iomanip>
    #include <sstream>
    
    using namespace std;
    
    int main()
    {
        for (long long zaehler = 0; zaehler < 68719476736; zaehler++)   // fuer 9 stelligen Zaehler
        {
            stringstream stream;
            stream << setw(9) << setfill('0') << uppercase << hex << zaehler << endl;
            string s(stream.str());
            cout << "test-"<< s << endl;
        }
    
        return 0;
    }
    

    Ahhhhhhh, tut das gut, Syntaxhighlighting und Einrücken, eine Augenweide, uiuiui!



  • @ Decimad - Der Code sieht zwar deutlich übersichtlicher aus, aber

    warning: integer constant is too large for ‘long’ type

    Muss ich dem Compiler noch ihrgendwie beibringen was long long ist?

    Rechner ist übrigends ein 32-Bit-System



  • Probier mal (das ULL nicht vergessen)

    for (unsigned long long zaehler = 0; zaehler < 68719476736ULL; zaehler++) {
    ...
    }
    

    Was gibt dir denn

    std::cout<<std::numeric_limits<unsigned long long>::max();
    

    aus?


Log in to reply