Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » stack overflow

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.04.2004, 09:54 Uhr
~chefmech
Gast


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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.04.2004, 10:51 Uhr
(un)wissender
Niveauwart


Ohne Code nichts los, Hellseher sind hier keine, soweit ich weiß, obwohl vielleicht kann 0xdeadbeef...ja, sicher kann er das
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
30.04.2004, 11:49 Uhr
virtual
Sexiest Bit alive
(Operator)


Bei C werden parameter gepusht, allerdings nicht mit pop wieder abgeräumt (sondern mit ret), von daher braucht dich das "Fehlen" der pops nicht zu stören.

Hört sich für mich danach an, als würdest Du dir den Stack zerschiessen, ist aber wilde Spekulation, siehe Post 001
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
30.04.2004, 12:57 Uhr
~chefmech
Gast


Ok, hier ist der gesuchte Code:

Dies ist die Fehlerhafte Methode

C++:
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];
                    }
                }
            }
        }
    }
}


Hier noch die zugeh. Headerdatei:

class optimizer{
    public:
        //Public Variabeln
        int MaxElemente;                                //Anzahl Elemente im Filter
        int MinElemente;
        int MinLaenge;                                //Totale Länge des gesamten Filters (in mm)
        int MaxLaenge;
        int AnzDurchl;                                //Totale Länge des gesamten Filters (in mm)
        char * Dateiname;      //Dateiname der Ausgabedatei
        bool BeginnGross;                                   //Als erstes Element grosser Topf?

        int UnterePruefpunkte;                           //Anzahl UnterePruefpunkte
        float *RefFreqU;  //Referenz Frequenzen untere Prüfpunkte (in MHz)
        float *ReferenceU;   //Referenz Elemente untere Prüfpunkte (in dB)

        int OberePruefpunkte;                           //Anzahl OberePruefpunkte
        float *RefFreqO;                         //Referenz Frequenzen obere Prüfpunkte (MHz)
        float *ReferenceO;                        //Referenz Elemente obere Prüfpunkte

        int Toleranz;
        //Konstruktoren

        optimizer();

        //Public Methoden

        inline bool optimizer::GesamtLaenge();
        void optimizer::MonteCarlo();
        bool optimizer::optim1();
        void optimizer::optim2();
        void optimizer::optim3();
        void optimizer::optim4();
        void optimizer::optim5();
        void optimizer::optim6();
        float BestFit();
        float BestFitTot();

        void optimizer::PruefpunkteSetzen();
        void optimizer::PruefpunkteSetzen2();
    private:
        //Private Variabeln

        int Laengen[30];   //Hauptarray definieren
        int Laengen2[30];  //Hauptarray definieren
        int b,q;                //Hilfsvariable für Ausgabe der Anz. Möglichkeiten
        float BestFitness;    //Bestes Ergebnis
        float Fitness;            //Fitness des Objektes (je kleiner desto besser)
        float BestFitTemp;
        int TotalLaenge;            //Totallänge des ganzen Filters
        int VerwendeteElemente;
};





Bearbeitung von Pablo:

cpp tags added


Dieser Post wurde am 30.04.2004 um 21:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
30.04.2004, 13:09 Uhr
~chefmech
Gast


Nein Sorry, das war die Falsche Methode :-)

Hier wäre die richtige:

C++:
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];
                        }
                    }
                }
            }
        }

    }
}




Bearbeitung von Pablo:

Bitte, cpp tags selber benutzen


Dieser Post wurde am 30.04.2004 um 21:19 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
30.04.2004, 13:43 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hmm seh ich auch spontan nicht
legst du in den methoden die du in optim6 aufrufst eventuell grosse arrays auf dem stack an?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
30.04.2004, 14:36 Uhr
~chefmech
Gast


Nei, hab jetzt herausgefunden, dass der Fehler irgendwo in der von optim6 aufgerufenen Funktion AppendFile() liegt. Wenn ich sie von einem andern Programm aufrufe, dann gehts, hier aber kommt der Fehler kommt der Fehler nach der Zeile

ofstream file;

Der Stackoverflow kommt also beim file.open(...) , keine Ahnung warum....
Hab Alle Parameter überprüft, die sind OK, er will aber die Datei nicht öffnen


C++:

void inline AppendFile (char *dat,int *p, int anz,float Fit){
    ofstream file;
    file.open("d:\\pbl\\software\\Ausgabe.ryf",ios::app);
    file<<Fit;
    float mm;
    while(anz){
        mm=float( (*p))/1000;
        file<<","<<mm;
        p++;
        anz--;
    }
    cout<<endl;
    file<<endl;
    file.close();
}




Bearbeitung von Pablo:

:cry: bitte, benutze die cpp tags


Dieser Post wurde am 30.04.2004 um 21:20 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: