Funktionen mit einer ID versehen


  • Mod

    Och, das solltest du dir mit den genannten Mitteln eigentlich selber denken können. Ganz dicker Tipp: rand() % range + minimum gibt dir eine Zufallszahl zwischen minimum (inklusive) und minimum + range (exklusive). Den Rest schaffst du dann hoffentlich alleine. Denk aber auch mal nach, warum das so ist!



  • Ja, bedingt:

    srand(time(NULL));
    	zufall = rand() % sizeof(buchstabenVektor);
    
    	note.spieleNote(buchstabenVektor.at(zufall));
    
    	Sleep(1000);
    
    	srand(time(NULL)); // die zeile hatte ich vorher nicht
    	zufall = rand() % sizeof(buchstabenVektor) + zufall; // Hier Fehler
    	note.spieleNote(buchstabenVektor.at(zufall));
    

    Nur hat er noch die Möglichkeit, außerhalb des Vektors zu gelangen schätze ich mal, da er ab und zu nen Fehler auswirft und das Programm beendet - ich denk halt mal, dass er außerhalb der Grenzen des Vektors sucht, nix findet und abbricht.

    Edit: Denkfehler oder? Wenn ich beim ersten mal die 24 ziehe hat er ja nix mehr nach oben schätz ich mal^^ Also beim ersten mal die Grenze bei 23 ziehen schätze ich mal, oder?^^


  • Mod

    Alles falsch. Und hat auch nicht im geringsten mit den Antworten zu tun. Wo hast du das denn her? srand benutzt man so nicht. sizeof erst recht nicht. Der Fehler tritt auch bestimmt erst eine Zeile später aus, oder? Guck nochmal nach.

    Fehlerkorrekturen:
    1. Ansehen und verstehen, was srand genau macht, ggf. mal ein paar Beispiele angucken
    2. Oje. Da kann ich nicht helfen, außer dich auf ein Lehrbuch zu verweisen. sizeof hat bei einem Container gar nichts zu suchen und wenn du das anders denkst, dann musst du noch einmal die Grundlagen wiederholen.



  • SeppJ schrieb:

    In C++98 kannst du aber immerhin schöner aufschreiben:

    char *values[]={"A.mp3", "B.mp3", "C.mp3"};
    vector<string> foo(values, values + sizeof(values)/sizeof(*values));
    

    const-correctness? 😉



  • SeppJ schrieb:

    Alles falsch. Und hat auch nicht im geringsten mit den Antworten zu tun. Wo hast du das denn her? srand benutzt man so nicht. sizeof erst recht nicht. Der Fehler tritt auch bestimmt erst eine Zeile später aus, oder? Guck nochmal nach.

    Fehlerkorrekturen:
    1. Ansehen und verstehen, was srand genau macht, ggf. mal ein paar Beispiele angucken
    2. Oje. Da kann ich nicht helfen, außer dich auf ein Lehrbuch zu verweisen. sizeof hat bei einem Container gar nichts zu suchen und wenn du das anders denkst, dann musst du noch einmal die Grundlagen wiederholen.

    Ich hab mit srand noch nie gearbeitet - muss ich mich da nochmal einlesen.

    sizeof...haste Recht - ich verwechsel das iwie dauernd mit

    vector.size()
    

    -.-


  • Mod



  • Okay...falls ich jetzt nicht ganz falsch liege...

    int iMax = buchstabenVektor.size() - 1;
    
    	srand(static_cast<int>(time(NULL)));
    
    	assert(iMax - 0 < RAND_MAX);
    
    	zufall = rand() % iMax;
    
    	spieleNote(buchstabenVektor.at(zufall));
    
    	Sleep(1000);
    
    	zufall = rand() % iMax + zufall;
    
    	spieleNote(buchstabenVektor.at(zufall));
    

    Trotzdem kommt immer noch folgende Fehlermeldung - bzw. nicht immer, sondern ab und zu, ich schätze irgendwie, wenn er außerhalb des Vektors nach einer Zahl sucht...?

    http://www.file-upload.net/download-4651007/Fehlermeldung.png.html


  • Mod

    Wenn du Zahlen zwischen zufall und buchstabenVektor.size() suchst, wie groß ist dann der Bereich, aus dem die Zahlen kommen können?



  • Das ist das Ding...

    falls ich am Anfang die 23 ziehe, hab ich ja...gar keine Zahl mehr übrig 😃

    Dann muss ich meine Bedingung noch iwie ändern...^^

    zufall = rand() % iMax;
    
    // ...
    
    zufall = rand() % iMax + (zufall - 1);
    

    iMax = 23

    sagen wir mal, wir ziehen beim ersten Mal die 23 direkt, dann ergibt sich:

    zufall = 23 + 22 - also könnte er von 22 - 23 noch etwas ziehen, oder seh ich das falsch?



  • Ich verstehe zwar nicht was du meinst, aber falls du den Vektor beliebig durchmischen möchtest, kannst du das mit random_shuffle tun.

    #include <algorithm> // ganz oben im File
    
    // Benutzung:
    std::random_shuffle (buchstabenVektor.begin(), buchstabenVektor.end());
    // jetzt ist buchstabenVektor zufällig durchmischt
    


  • Nochmal:

    ich spiele zuerst einen zufälligen Ton ab aus meinem Vektor - in meinem Vektor befinden sich 24 Noten, also 0-23 zur Auswahl.

    Jetzt spiele ich zum ersten Mal einen Ton ab

    zufall = rand() % iMax;
    spieleNote(buchstabenVektor.at(zufall));
    

    jetzt möchte ich, dass der nächste Ton höher ist, als der schon gespielte - also muss ich dann die Ziehung eingrenzen - von der eben gezogenen Zahl bis zum Ende des Vektor.

    Wenn ich z.B. beim ersten Mal die 13 ziehe, will ich danach nur von 13 - 23 ziehen können. Von durchmischen hatte ich nie etwas erwähnt...

    Das Problem ist jetzt aber nur, dass er anscheinend außerhalb meines Vektors auch sucht, darum hatte ich es mit

    zufall = rand() % iMax + zufall;
    spieleNote(buchstabenVektor.at(zufall));
    

    probiert.

    Meiner Hoffnung nach wäre das, wenn wir beim Beispiel 13 bleiben:

    zufall = rand() % 23 + 13

    also zieht er jetzt von 13 - 23. Nur schmeißt er mir immer noch den Fehler (da hatte ich das Bild ja zu hochgeladen...)



  • Beispielrechnung:

    Zufallszahl 42:
    42%23=19
    19+13=32
    32 ist out of Range..



  • Danke...Manchmal hat man halt ein Brett vorm Kopp...^^

    Ja...klingt durchaus logisch was du da schreibst...^^

    Danke 😉

    int iMax = buchstabenVektor.size() - 1;
    
    	srand(static_cast<int>(time(NULL)));
    
    	zufall = rand() % iMax;
    
    	spieleNote(buchstabenVektor.at(zufall));
    
    	Sleep(1000);
    
    	zufall = rand() % (iMax - zufall) + zufall;
    
    	spieleNote(buchstabenVektor.at(zufall));
    

    funktioniert einwandfrei.


Anmelden zum Antworten