Phänomen



  • Wer kann mir helfen?

    habe ein kleines Programm geschrieben. In meinem Buch steht fast nichts zu map, habe daher nur nach ein paar Googelungen etwas zusammengbastelt, was nur halb funktioniert. Mich interessiert, warum das Macro für den value von Map immer so eine seltsame Zahl (1606415264) ausgibt, statt die Folge von einsen und zweien, die erwartet wird.

    #include <iostream>
    #include <stdio.h>
    #include <cmath>
    #include <map>
    using namespace std;
    
    int pzz=1; //Primzahlzähler
    int vfz=1; //Vielfachenzähler
    int ruz=1; //Rundenzähler
    
    int main()
    {
        map <int,int> prufzahlen;
        map<int, int>::iterator iter;
        int x, i;
        for (x = 31; x <= 1200; x=x+30)
        {
            ruz++;
            for (i = 2; i < x; i++)
            {
                if (x%i == 0)
                    break;
                //cout<<i<<"= i \n";
            }
    
            if (i == x)
            {
                cout<<"Nr. "<<ruz<<" "<<x<<" = "<<pzz<<". Pz. \n";
    
                pzz++;
                 prufzahlen.insert(pair<int, int>(x, 1));
            }
            else
            {
                cout<<"Nr. "<<ruz<<" "<<x<<" = "<<vfz<<". uVf. \n";
                vfz++;
                 prufzahlen.insert(pair<int, int>(x, 2));
            }
            cout << "Test = " ;
            for (iter = prufzahlen.begin(); iter != prufzahlen.end(); iter++)
                cout << iter->first << " ";
           cout << iter->second << " ";
            cout << endl;      
        }
        return 0;
    }
    

    Das ist die Ausgabe:

    Nr. 2 31 = 1. Pz.
    Test = 31 1606415264
    Nr. 3 61 = 2. Pz.
    Test = 31 61 1606415264
    Nr. 4 91 = 1. uVf.
    Test = 31 61 91 1606415264
    Nr. 5 121 = 2. uVf.
    Test = 31 61 91 121 1606415264
    Nr. 6 151 = 3. Pz.
    Test = 31 61 91 121 151 1606415264
    Nr. 7 181 = 4. Pz.



  • Meintest Du eventuell

    for (iter = prufzahlen.begin(); iter != prufzahlen.end(); iter++)
            {//neue Klammer
                cout << iter->first << " ";
                cout << iter->second << " ";
            }//neue Klammer
    

    ?



  • Danke, das meint ich, ich hab's nur noch nicht verstanden, was das für eine Zahl ist ....



  • Sonne55 schrieb:

    cout << "Test = " ;
            for (iter = prufzahlen.begin(); iter != prufzahlen.end(); iter++)
                cout << iter->first << " ";
           cout << iter->second << " ";
            cout << endl;
    

    Noch mal zur Erläuterung: die Schleife wir verlassen, wenn der Iterator auf prufzahlen.end() zeigt. Und das ist ein Element, nach dem letzten. Daher zeigt iter->second nach der Schleife auf ein nicht exisitierendes Element und wird daher irgendetwas ausgeben oder gar abstürzen.

    Ein kleiner Tipp, um solche Fehler zu vermeiden: Immer die Variablen möglichst spät und möglichst im geringst möglichen Scope definieren. Hättest Du den Iterator so definiert:

    for (map<int, int>::const_iterator iter = prufzahlen.begin(); iter != prufzahlen.end(); iter++)
    

    hätte der Compiler Dich bereits darauf hingewiesen, dass der Iterator nach der Schleife nicht definiert ist. Ich habe ausserdem aus dem iterator ein const_iterator gemacht, weil ich nicht anders kann 😃 . Const-correctess ist einfach so in Fleisch und Blut übergegangen.

    Und wenn Du tatsächlich die Ausgabe haben willst, die ich vermute, dann kannst Du die Ausgabeoperationen elegant verketten. Ich würde es in etwa so schreiben:

    std::cout << "Test = ";
            for (map<int, int>::const_iterator iter = prufzahlen.begin(); iter != prufzahlen.end(); ++iter)
                std::cout << iter->first << " " << iter->second << " ";
            std::cout << endl;
    

    Mit C++11 geht das natürlich noch viel kürzer.


Log in to reply