Segmentation fault beim Ausführen



  • Hallo,

    bekomme einen Segmentation fault beim Ausführen des folgenden Codes. Soweit ich weiß kommt dieser Fehler dadurch zustande dass das Programm auf einen Speicherbereich zugreift der nicht ihm gehört. Ich dachte mir zuerst der Fehler kommt durch das Umwandeln von double auf int zustande, da ich int(d) verwende Zeile 32 bzw. 33 aber auch umschreiben auf static_cast<int>(d) hat nichts geholfen. Sobald ich den Code in ein XCode Projekt einbinde ist das Ausführen allerdings kein Problem.

    Vielen Dank.

    #include<cmath>
    #include<fstream>
    #include<iostream>
    #include<vector>
    #include<complex>
    
    using namespace std;
    
    double euler(double u_j0, double u_j10, double u_minj0, double t_step, double x_step) {
    
    	double u_j1;
    
    	u_j1 = u_j0 + t_step/pow(x_step, 2.0) * (u_j10 - 2.0*u_j0 + u_minj0);
    
    	return u_j1;
    }
    
    int main(void) {
    
    	double discretesation = 1.0/6.0;
    	double x_step = 1.0e-5;
    	double eval_point = 0.05;
    
    	double t_step;
    	int loop_x, loop_t;
    
    	t_step = pow(x_step, 2.0)/discretesation;
    	loop_x = int(1/x_step);
    	loop_t = int(eval_point/t_step);
    
    	double u[loop_x][loop_t], u_analytical[loop_x][loop_t];
    	double x = 0.0;
    
    	for (int i = 0; i < loop_t; i++) {
    
    		u[0][i] = 0.0;
    		u[loop_x-1][i] = 0.0;
    	}
    
    	for (int i = 0; i < loop_x; i++) {
    
    		u[i][0] = sin(M_PI*x);
    		x = x + x_step;
    	}
    
    	double t = 0.0;
    	x = 0.0;
    
    	for (int i = 1; i < loop_t; i++) {
    
    		t = t + t_step;
    
    		for (int p = 1; p < loop_x-1; p++) {
    
    			x = x + x_step;
    			u[p][i] = euler(u[p][i-1], u[p+1][i-1], u[p-1][i-1], t_step, x_step);
    			u_analytical[p][i] = exp(-pow(M_PI, 2.0)*t) * sin(M_PI*x);
    		}
    
    		x = 0.0;
    	}
    
    	ofstream file1 ("diffusion.txt");
    	ofstream file2 ("exact.txt");
    	x = 0.0;
    
    	for (int i = 0; i < loop_t; i++) {
    
    		for (int p = 0; p < loop_x; p++) {
    
    			file1 << x << " " << u[p][i] << endl;
    			file2 << x << " " << u_analytical[p][i] << endl;
    			x = x + x_step;
    		}
    		x = 0.0;
    	}
    
    	file1.close();
    	file2.close();
    
    	return 0;
    }
    


  • Lass dir doch mal loop_x und loop_t ausgeben, und schau ob du überhaupt so viel Speicher hast.



  • Mal ne dumme Frage, aber welcher Compiler erlaubt dir diesen FALSCHEN Code (außer Dev cpp)?

    int loop_x, loop_t;
    
    loop_x = int(1/x_step);
    loop_t = int(eval_point/t_step);
    
    double u[loop_x][loop_t], u_analytical[loop_x][loop_t];
    

    Das darfst du nicht machen. Ein Array muss immer mit constanten variablen initialisiert werden! Alternative mit new Speicher reservieren...


  • Mod

    Selbst wenn du so viel Speicher hast(was gut sein kann): Das liegt alles auf dem Stack und wird ihn dir sprengen! Benutz dynamische Speicherverwaltung, also std::vector oder, falls du automasochistisch veranlagt bist, new/delete.



  • HighLigerBiMBam schrieb:

    Mal ne dumme Frage, aber welcher Compiler erlaubt dir diesen FALSCHEN Code (außer Dev cpp)?

    Ein C++-Compiler, der Teile von C99 unterstützt?


  • Mod

    HighLigerBiMBam schrieb:

    Das darfst du nicht machen. Ein Array muss immer mit constanten variablen initialisiert werden! Alternative mit new Speicher reservieren...

    Das hat zum Beispiel der g++ als Feature, hat was mit C99 zu tun, welches der gcc ohnehin unterstützt, da wäre es doch doof dies bei g++ auszuschalten.



  • Michael E. schrieb:

    HighLigerBiMBam schrieb:

    Mal ne dumme Frage, aber welcher Compiler erlaubt dir diesen FALSCHEN Code (außer Dev cpp)?

    Ein C++-Compiler, der Teile von C99 unterstützt?

    Das gehört verboten 😞

    Danke!



  • Lass dir doch mal loop_x und loop_t ausgeben, und schau ob du überhaupt so viel Speicher hast.

    Danke! Daran hab ich natürlich nicht gedacht...

    Benutz dynamische Speicherverwaltung, also std::vector

    An einen Vector habe ich zuerst auch gedacht allerdings weiß ich nicht wie ich einen 2 dimensionalen Vector definieren kann!?
    Ich bitte meine Unwissenheit zu entschuldigen...


  • Mod

    Poolshark schrieb:

    An einen Vector habe ich zuerst auch gedacht allerdings weiß ich nicht wie ich einen 2 dimensionalen Vector definieren kann!?
    Ich bitte meine Unwissenheit zu entschuldigen...

    vector<vector<was_ein_typ_auch_immer> >
    Stolpersteine:
    - Die letzten beiden > müssen durch ein Leerzeichen getrennt sein, sonst erkennt der Compiler dort den Operator >> .

    - Denk daran dass in den äußeren vector Elemente vom Typ vector<was_ein_typ_auch_immer> gehören! Und die musst du da auch irgendwie reinpacken, bevor du das benutzen kannst.

    Ansonsten eigentlich genau wie immer. Das woran man als Anfänger meistens nicht denkt ist, dass die vectoren natürlich zuerst irgendwie gefüllt werden wollen, bevor man sie benutzen kann. Ob dies durch push_back, resize oder direkt durch Benutzung des passenden Konstruktors geschieht (oder auf eine der anderen zahlreichen Arten und Weisen) hängt von deinem Einsatzzweck ab. Du willst vermutlich etwas direkt im Konstruktor:
    vector<vector<double> > foo(loop_x, vector<double>(loop_y));



  • vector<vector<double> > foo(loop_x, vector<double>(loop_y));

    Vielen, vielen Dank! Das war genau das was ich suchte! Hat mir einiges an Kopfzerbrechen erspart!


Anmelden zum Antworten