PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : stack overflow c++



chefmech
30.04.2004, 11:09
Ich hab das Problem, dass mir das Windows nach einigen Durchläufen meines Programmes einen stack overflow meldet. Der Zeitpunkt des überlaufes kann ich nicht genau lokalisieren, da er be jedem Versuch variiert (zw. 200 und 20'000 Durchlaufen). Ich kann mir aber nicht vorstellen, wesshalb dieser Fehler auftritt, denn ich hab keine Methoden / Funktionen, welche sich von selbst aufrufen.
Ich hab eine Klasse mit einigen lokalen Variabeln. Im Mainprogramm erstelle ich nur gerade 1 Objekt der Klasse, nachher führe ich nacheinander ein paar Methoden der Klasse auf. In einer Methode kommt nun der Stack overflow.

Ich hab noch relativ viele rand() aufrufe, könnte das eventuell ein Problem sein?

Wenn ich nach der Fehlermeldung den VS-Debugger starte, sehe ich im Assembler Code, dass er relativ viele push macht und fast keine pop, weiss aber nicht warum.

Wäre toll, wenn ihr mich auf ein paar mögliche Fehler hinweisen könntet.

flaviocu
30.04.2004, 12:28
Wäre toll, wenn ihr mich auf ein paar mögliche Fehler hinweisen könntet.
Wenn du noch den Code postest waere es sicher einfacher!

chefmech
30.04.2004, 14:01
Ok, hier ist der gesuchte Code:

Dies ist die Fehlerhafte Methode

void optimizer::optim5(){
for(b=0;b<AnzDurchl;b++){
do{
for (int z=0;z<VerwendeteElemente;z++){ //Altes Objekt zurückkopieren
Laengen[z]=Laengen2[z];
}

for(int i= 0;i<2;i++){ //Länge mutieren
Laengen[rand()%VerwendeteElemente]+=rand()%50;
}
for(int i= 0;i<2;i++){
Laengen[rand()%VerwendeteElemente]-=rand()%50;
}
}while(!GesamtLaenge());

//Auswerten
Fitness=0;
if (ErgebnisPruefenTolU(&Laengen[0],&ReferenceU[0],&RefFreqU[0],Toleranz,VerwendeteElemente,&Fitness,BeginnGross,UnterePruefpunkte)){ //Untergrenze Prüfen
if (ErgebnisPruefenTolO(&Laengen[0],&ReferenceO[0],&RefFreqO[0],Toleranz,VerwendeteElemente,&Fitness,BeginnGross,OberePruefpunkte)){ //Obergrenze Prüfen
if (Fitness>BestFitTemp||Fitness==0){
BestFitTemp=Fitness;
for (int z=0;z<VerwendeteElemente;z++){
Laengen2[z]=Laengen[z];
}
}
}
}
}
}

Unregistriert
30.04.2004, 14:05
Nein, sorry, das war die falsche Methode!!!!!!


Hier die richtige:


void optimizer::optim6(){
BestFitTemp=-10000;
int q=0,j=0,k=0,a=0,b=0;
srand(time(NULL));
for(b=0;b<AnzDurchl;b++){
do{
for (int z=0;z<VerwendeteElemente;z++){ //Altes Objekt zurückkopieren
Laengen[z]=Laengen2[z];
}
j=rand()%VerwendeteElemente;
k=rand()%VerwendeteElemente;
a=rand()%50;
b=rand()%50;
//cout<<q++<<" "<<j<<" "<<k<<" "<<a<<" "<<b<<" "<<VerwendeteElemente<<endl;
Laengen[k]+=a;
Laengen[j]-=b;

}while(!GesamtLaenge());

//Auswerten
Fitness=0;
if (ErgebnisPruefenTolU(&Laengen[0],&ReferenceU[0],&RefFreqU[0],Toleranz,VerwendeteElemente,&Fitness,BeginnGross,UnterePruefpunkte)){ //Untergrenze Prüfen
if (ErgebnisPruefenTolO(&Laengen[0],&ReferenceO[0],&RefFreqO[0],Toleranz,VerwendeteElemente,&Fitness,BeginnGross,OberePruefpunkte)){ //Obergrenze Prüfen
cout<<Fitness<<endl<<BestFitTemp<<endl;
if (Fitness>BestFitTemp||Fitness==0){
cout<<Fitness<<endl;
if (Fitness>BestFitness||Fitness==0){
BestFitness=Fitness;
BestFitTemp=Fitness;
cout<<"Neues Topobjekt gefunden. Fitness: "<<Fitness<<endl;
if (Fitness>-30){
AppendFile(Dateiname,&Laengen[0],VerwendeteElemente,Fitness);
}
for (int z=0;z<VerwendeteElemente;z++){
Laengen2[z]=Laengen[z];
}
}
else{
BestFitTemp=Fitness;
cout<<"Neues Objekt gefunden. Fitness: "<<Fitness<<endl;
for (int z=0;z<VerwendeteElemente;z++){
Laengen2[z]=Laengen[z];
}
}
}
}
}

}
}

Unregistriert
30.04.2004, 14:07
Das mit dem Quellcode ist leider nicht so einfach, da das Forum macht, was es will!!!!

Ich versuchs nochmal:

void optimizer::optim6(){
BestFitTemp=-10000;
int q=0,j=0,k=0,a=0,b=0;
srand(time(NULL));
for(b=0;b<AnzDurchl;b++){
do{
for (int z=0;z<VerwendeteElemente;z++){ //Altes Objekt zurückkopieren
Laengen[z]=Laengen2[z];
}
j=rand()%VerwendeteElemente;
k=rand()%VerwendeteElemente;
a=rand()%50;
b=rand()%50;
Laengen[k]+=a;
Laengen[j]-=b;

}while(!GesamtLaenge());

//Auswerten
Fitness=0;
if (ErgebnisPruefenTolU(&Laengen[0],&ReferenceU[0],&RefFreqU[0],Toleranz,VerwendeteElemente,&Fitness,BeginnGross,UnterePruefpunkte)){ //Untergrenze Prüfen
if (ErgebnisPruefenTolO(&Laengen[0],&ReferenceO[0],&RefFreqO[0],Toleranz,VerwendeteElemente,&Fitness,BeginnGross,OberePruefpunkte)){ //Obergrenze Prüfen
cout<<Fitness<<endl<<BestFitTemp<<endl;
if (Fitness>BestFitTemp||Fitness==0){
cout<<Fitness<<endl;
if (Fitness>BestFitness||Fitness==0){
BestFitness=Fitness;
BestFitTemp=Fitness;
cout<<"Neues Topobjekt gefunden. Fitness: "<<Fitness<<endl;
if (Fitness>-30){
AppendFile(Dateiname,&Laengen[0],VerwendeteElemente,Fitness);
}
for (int z=0;z<VerwendeteElemente;z++){
Laengen2[z]=Laengen[z];
}
}
else{
BestFitTemp=Fitness;
cout<<"Neues Objekt gefunden. Fitness: "<<Fitness<<endl;
for (int z=0;z<VerwendeteElemente;z++){
Laengen2[z]=Laengen[z];
}
}
}
}
}

}
}

flaviocu
30.04.2004, 17:49
Das mit dem Quellcode ist leider nicht so einfach, da das Forum macht, was es will!!!!
<anzdurchl ;b=""><verwendeteelemente ;z="" objekt="" zurückkopieren=""><fitness =""><endl =""><bestfittemp =""><endl ;=""><fitness =""><endl ;=""><fitness =""><endl ;=""><verwendeteelemente ;z=""><fitness =""><endl ;=""><verwendeteelemente ;z="">
Vielleicht gehts besser wenn du das Ding anhaengst, anstatt reinzukopieren...
</verwendeteelemente></endl></fitness></verwendeteelemente></endl></fitness></endl></fitness></endl></bestfittemp></endl></fitness></verwendeteelemente></anzdurchl>

MacSeck
01.05.2004, 14:28
bin zwar nicht der!!! "C-Crack", aber z ist nicht initialisiert und in der Umkopierschleife ändert sich z auch nicht und es wird kein Abbruch geprüft.

Die I Sache leuchtet ja noch ein -->
for i = 0 to 1 do irgendwas

Frage warum das i++<2 ??? wenn i int ist. aber das mal dahingestellt...

Nur bei dem z wird weder z++ also irgendwie der Index erhöht, noch hat das Ding einen Abbruch.
Abgesehen davon wäre es effizienter (denke ich mal), wenn Du statt des Array-Umkopierens von Laenge1(z) nach Laenge2(z) einfach einen Zeiger auf das Array setzen würdest und den dann tauschen, also aus Array1 Array2 machen durch einfaches Umsetzen der Startadresse im Speicher
Laenge1^ = Laenge2^

hellraiser
01.05.2004, 15:12
z wird im for() deklariert, allerdings scheint da beim posten was nicht geplappt zu haben mit den <> zeichen (HTML ;)