Equzioni differenziali.

di il
2 risposte

Equzioni differenziali.

Buongiorno
devo scrivere un programma che risolva equazioni differenziali. Sono abbastanza sicuro di esserci riuscito, ma mi dà problemi con un operator che non funzia come dovrebbe.

Main (L'errore è alla rifa Datiiniziali=myOiler...

[...]
	for(int i=0;i<(t_max-t_min)/h;i++){
	double x,y;
	x=t_min+i*h;
	DatiIniziali= myOiler.Passo(0, DatiIniziali ,h);
	y=DatiIniziali.GetComponent(1);
	g->SetPoint(i,x,y);
	};

[...]
vettore.h

VettoreLineare& VettoreLineare::operator=(VettoreLineare& k){
	if (_v) delete [] _v;
	_N= k.GetN();
        _v = new double[k.GetN()]; 
	for(int i=0;i<_N;i++){
		_v[i]=k.GetComponent(i);
	};
	return *this;
};
classe vettore

#ifndef Vettore_lineare_
#define Vettore_lineare_
#include <iostream>
#include <cmath>
#include <cstdlib>

class Vettore{
	
	protected:
	int _N;
	double* _v;
	
	public:
	Vettore(unsigned int N);
 	void SetComponent(double i, int n);	
	double GetComponent(int c){return _v[c];};
//	virtual void print( );
	int GetN(){return _N;};
	
};

class VettoreLineare:public Vettore{

	public:
	VettoreLineare(unsigned int N):Vettore(N){};
	VettoreLineare operator+ (VettoreLineare& k);
	double operator*(VettoreLineare& k);
	VettoreLineare operator*(double lambda);
	VettoreLineare& operator=(VettoreLineare& k);
};
#endif
ci sarebbe poi anche una parte che risolve l'equazione, ma non è lì l'errore. La cosa strana è che mi accetta l'uguaglianza fra vettori nella definizione dell'oggetto, ovvero:

VettoreLineare Vettore1= Vettore2;

è ok, mentre:

Vettore1=Vettore2;

mi produce questo errore:
g++ -c main.c -o main.o `root-config --cflags`
main.c: In function ‘int main(int, char**)’:
main.c:33: warning: taking address of temporary
main.c:33: error: no match for ‘operator=’ in ‘DatiIniziali = & myOiler.Eulero::Passo(0.0, ((VettoreLineare&)(& DatiIniziali)), h)’
Vettore_Lineare.h:29: note: candidates are: VettoreLineare& VettoreLineare::operator=(VettoreLineare&)
make: *** [main.o] Error 1
spero di esser stato completo e vi ringrazio in anticipo perché ci sto smattando su questa cosa...

2 Risposte

  • Re: Equzioni differenziali.

    Ciao tanatofobico, l'errore dato dal compilatore mi sembra chiarissimo.
    no match for ‘operator=’ in ‘DatiIniziali = & myOiler.Eulero::Passo(0.0, ((VettoreLineare&)(& DatiIniziali)), h)’
    candidates are: VettoreLineare& VettoreLineare::operator=(VettoreLineare&)
    Nella dichiarazione, stai utilizzando il copy constructor, pertanto essa equivale a
    VettoreLineare Vettore1 (Vettore2);
    . Anche se non lo definisci tu, il compilatore te ne fornisce uno di default.
    Invece, in
    Vettore1 = ...;
    stai utilizzando l'operatore '='. Come vedi dall'errore, il compilatore si aspetta un oggetto di tipo VettoreLineare, mentre pare che tu gli stia passandogli altro.
    Cosa restituisce la funzione Passo?
  • Re: Equzioni differenziali.

    La funzione passo restituisce un vettore lineare, ottenuto con il metodo di Eulero, ovvero:

    
    virtual VettoreLineare Eulero::Passo(double t, VettoreLineare g, double h){
    VettoreLineare vec= g+_f->Eval(t,g)*h; 
    return vec;
    }; 
    //non l'ho copiato, l'ho riscritto così su due piedi, nell'originale non ci sono errori di compilazione, perdonatemi gli eventuali errori.
    
    dove _f è una funzione (classe definita in un altro file) a valori vettoriali che fa parte dei datamembri privati della classe e Eval è un suo metodo che semplicemente restituisce il valore della funzione (notare che in questo caso ho usato la sintassi che funziona, e infatti l'uguaglianza funziona).

    In realtà l'overloading dell'operatore l'avevo anche fatto in un esercizio precedente, con un main molto semplificato; in parole povere (la classe vettorelineare era la stessa):
    
    VettoreLineare A(N);
    VettoreLineare B(N);
    VettoreLineare C(N);
    C=A+B;
    
    e il programma mi dava lo stesso errore (Ho verificato che anche la sola uguaglianza, senza la somma, dà lo stesso errore). Il costruttore utilizzato in questo caso assegnava le zone di memoria per un array (puntatore) di N componenti, azzerandole tutte.

    Se necessario posso quotare tutto il programma, solo non volevo disturbare troppo
Devi accedere o registrarti per scrivere nel forum
2 risposte