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.