Release Build - seltsames Problem [Gelöst]



  • Hallo,

    ich habe ein sehr seltsames Problem und kann mir leider überhaupt nicht erklären wie es dazu kommt.

    Folgender Code soll (in einem größeren Sudoku-Programm) Zufallszahlen zwischen 0 und 10 (je ausgeschlossen) eine Zufallszahl außer der im Vektor "ausnahmen" angegebenen erzeugen:

    vector<int> verbleibende_zufallszahlen2;
    
    int zufallszahl_außer(vector<int> ausnahmen)
    {
    	for(int a=1;a<10;a++)//alle möglichen zahlen außer ausnahmen einfügen
    	{
    		//alle außer ausnahmen einfügen:     -->STELLE 1<--
    
    		for(int b=0;b<ausnahmen.size();b++)
    		{
    			if(ausnahmen[b]==a)
    			{
    				continue;
    			}
    		}
    
    		verbleibende_zufallszahlen2.push_back(a);//-->STELLE 2<--
    	}
    
    	//zufallsindex
    	int index=rand()%verbleibende_zufallszahlen2.size();
    	//zufallszahl
    	int zufallszahl=verbleibende_zufallszahlen2[index];
    	verbleibende_zufallszahlen2.erase(verbleibende_zufallszahlen2.begin()+index);//aus verbleibenden entfernen
    
    	return zufallszahl;
    
    }
    

    Der Code compiliert sowohl im Debug- als auch im Release-Mode von Visual Studio 2010 Express, Win 7 32 bit fehlerfrei.
    Im Debug-Modus liefert er auch genau das gewünschte Ergebnis und alles läuft hervorragend 👍

    aber sobald ich den release-build laufen lasse liefert mir der Code irgendwelche Zahlen zwischen 0 und 10 ohne die Ausnahmen zu berücksichtigen 😕

    wenn ich mit dem Debugger schrittweise durchgehe spring er von STELLE 1 (siehe code) direkt zu STELLE 2, als ob dazwischen gar nichts stünde 😮 So ist zwar zu erklären dass alle Zahlen im VEktor der verbleibenden landen, aber das sollte ja genau nicht passieren!!!

    Die innere for-Schleiufe wird einfach ignoriert, wie wenn sie nicht existieren würde 😞

    Weiß vielleicht jemand woran das liegt und was ich ändern muss damit es auch im Release funktioniert?

    danke schonmal,
    andi01.



  • Naja, die Schleife

    for(int b=0;b<ausnahmen.size();b++)
            {
                if(ausnahmen[b]==a)
                {
                    continue;
                }
            }
    

    macht netto nichts, das ist schon richtig so. Das sollte aber auch im Debug-Modus nichts tun.



  • erstmal danke für die Antwort...

    Die Schleife erfüllt den Zweck, dass ein Objekt im Vektor ausnahmen nich in verbleibende-objekte2 eingefügt wird... sie ist also nötig 😋

    und wie kann ich das Problem jetzt beheben wo ich weiß dass es daran liegt? einfach eine dummy-funktion darin ausführen dass sie nicht übersprungen wird?

    btw: im debug-modus wird die schleife brav ausgeführt, nu im release wird sie einfach übersprungen...

    lg,
    andi01.



  • andi01 schrieb:

    erstmal danke für die Antwort...

    Die Schleife erfüllt den Zweck, dass ein Objekt im Vektor ausnahmen nich in verbleibende-objekte2 eingefügt wird... sie ist also nötig 😋

    Dir ist hoffentlich klar, daß das continue sich nur auf die innerste Schleife (for(b)) bezieht - und da es das einzige in dieser Schleife ist, ist es praktisch nutzlos. Warum suchst du eigentlich von Hand in dem vector<>, wenn es dafür fertige Funktionen gibt?

    if(find(ausnahmen.begin(),ausnahmen.end(),a)!=ausnahmen.end())
      continue;
    

    PS: Warum diese Schleife im Debug-Modus das macht, was du vorhast, ist mir allerdings auch ein Rätsel.



  • Ich könnte mir vorstellen, dass MSVC im Release-Modus die gesamte Schleife wegoptimiert, während sie im Debug-Modus drin bleibt. Allerdings wird sie auch dort nicht den gewünschten Effekt haben.



  • CStoll schrieb:

    Dir ist hoffentlich klar, daß das continue sich nur auf die innerste Schleife (for(b)) bezieht

    upps 🙄 hätte mir auch auffallen können 😃

    CStoll schrieb:

    Warum suchst du eigentlich von Hand in dem vector<>, wenn es dafür fertige Funktionen gibt?

    die Funktion hatte ich jetzt noch gar nicht gekannt... danke für den Tipp 🙂

    jetzt funktioniert alles bestens... für den Fall dass jemand ein ähnliches Problem hat hier mal der Code:

    vector<int> verbleibende_zufallszahlen2;
    
    int zufallszahl_außer(vector<int> ausnahmen)// GEHT NICHT IM RELEASE!!!!!!!
    {
    	for(int a=1;a<10;a++)//alle möglichen zahlen außer ausnahmen einfügen
    	{
    		//alle außer ausnahmen einfügen:     -->STELLE 1<--
    
    		if(find(ausnahmen.begin(), ausnahmen.end(), a)!=ausnahmen.end())
    		{
    			continue;
    		}
    
    		verbleibende_zufallszahlen2.push_back(a);//-->STELLE 2<--
    	}
    
    	//zufallsindex
    	int index=rand()%verbleibende_zufallszahlen2.size();
    	//zufallszahl
    	int zufallszahl=verbleibende_zufallszahlen2[index];
    	verbleibende_zufallszahlen2.erase(verbleibende_zufallszahlen2.begin()+index);//aus verbleibenden entfernen
    
    	return zufallszahl;
    
    }
    

    danke an alle für die Hilfe 🙂

    lg,
    andi01.


Anmelden zum Antworten