Array in Funktion



  • Hallo,
    Ich bin noch ganz am Anfang vom C++ lernen und hab deshalb mal eine Frage. Also mit der Datei unten wollte ich die DGL vom harmonischen Oszillator mit dem Euler-Verfahren numerisch lösen.
    In Zeile 10 wollte ich in eine Funktion ein Array mit zwei werten eingeben und ein Array mit zwei Werten als Ergebnis bekommen. Da bekomm ich jetzt immer eine Fehlermeldung. Wie kann man das anders schreiben oder wo ist bei meinem Ansatz der Fehler? Das gleiche hab ich in Zeile 27.
    Vielleicht kann mir da ja jemand helfen.
    Viele Grüße

    //Simulation Harmonischer Oszillator
    #include <iostream>
    using namespace std;
    
    // Omega festlegen
    double omega=1;
    
    // Funktion für rechte Seite
    double rs(double x_in[2]){double rhs[2]; rhs[0]=x_in[1]; rhs[1]=-omega*omega*x_in[0]; return rhs;};
    
    int main ()
    {
        int i;
        int n=100;
        double dt=0.001;
        double x[2];
        double k[2];
    
    //Anfangsbedingungen
    x[0]=0;
    x[1]=1;
    
    //Zeitschritt iterieren
    for(i=1;i<=n; i++)
    {k=rs(x);
    x[0]=x[0]+dt*k[0];
    x[1]=x[1]+dt*k[1];
    cout<<i*dt <<x[0];}
    
    return 0;
    }
    


  • Man kann keinen Array als Rückgabewert einer Funktion zurückgeben



  • Es gibt in c++ mehrere möglichkeiten 2 variablen aus einer Funktion zurückzubekommen..

    z.B. durch pointer, indem du das array schon mit übergibst, in dem das Ergebnis stehen soll:

    #include<iostream>
    using namespace std;
    
    double omega = 1;
    
    void rs(double *x_in,double *rhs)
    { 
    	rhs[0]=x_in[1]; 
    	rhs[1]=-omega*omega*x_in[0];
    }
    
    int main()
    {
    	double x_in_werte[2] = {1.01,3.785};
    	double rhs[2] = {0};	
    	cout << "rhs[0] = " << rhs[0] << endl;
    	cout << "rhs[1] = " << rhs[1] << endl;
    	rs(x_in_werte,rhs);
    	cout << "rhs[0] = " << rhs[0] << endl;
    	cout << "rhs[1] = " << rhs[1] << endl;
    	system("pause");
    	return 0;
    }
    

    Oder du machst es über pair (geht halt nur mit 2 werten):

    #include<iostream>
    using namespace std;
    
    double omega = 1;
    
    pair<double,double> rs(double x_in[2])
    {
    	pair<double,double> rhs;
    	rhs.first = x_in[1]; 
    	rhs.second = -omega*omega*x_in[0];
    	return rhs;
    }
    
    int main()
    {
    	double x_in_werte[2] = {1.01,3.785};
    	pair<double,double> rhs;
    	cout << "rhs.first = " << rhs.first << endl;
    	cout << "rhs.second = " << rhs.second << endl;
    	rhs = rs(x_in_werte);
    	cout << "rhs.first = " << rhs.first << endl;
    	cout << "rhs.second = " << rhs.second << endl;
    	system("pause");
    	return 0;
    }
    

    das sind die zwei die mir jetzt auf die schnelle einfallen..
    Wobei die zweite variante mit Objekten arbeitet, und ich weis nicht wie weit du jetzt genau bist mit deinen anstrengungen 😉

    dein code könnte z.B. so aussehen:

    #include<iostream>
    using namespace std;
    
    double omega = 1;
    
    void rs(double *x_in, double *rhs)
    {
    	rhs[0] = x_in[1]; 
    	rhs[1] = -omega*omega*x_in[0];
    }
    
    int main ()
    {
        int i;
        int n=100;
        double dt=0.001;
        double x[2];
        double k[2];
    
    	//Anfangsbedingungen
    	x[0]=0;
    	x[1]=1;
    
    	//Zeitschritt iterieren
    	for(i=1;i<=n; i++)
    	{
    		rs(x,k);
    		x[0]=x[0]+dt*k[0];
    		x[1]=x[1]+dt*k[1];
    		cout<< i*dt << " ; " << x[0] << endl;
    	}
    	system("pause"); //warten bis taste gedrückt wird...
    	return 0;
    }
    

Anmelden zum Antworten