Forum Programmation.c++ probleme avec une methode virtuelle

Posté par .
Tags : aucun
0
27
avr.
2005
bonjour,
pour un projet, le prof nous a donné une librairy .lib pour windows. cette librairy sert à resoudre des equations differentielles du 1er et 2eme ordre et autres...
j'essaye de coder une "fonction" permettant de resoudre les ED comme ca je pourrais utiliser mon programme plus facilement sous linux...

le PROBLEME: je definis une classe EquaDif avec une methode virtuelle F1AInteger qui est surchargée dans une classe fille(en fait arriere petite fille) circuit_a . Mais jutilise F1AInteger dans une methode Integre1erOdre de EquaDif, ce qui pose des probleme au compilateur...

Auriez vous une solution??? merci

voila les .h:

class EquaDif{
protected:
float LowerLimit; //limite inférieure t0 d'intégration
float UpperLimit; //limite supérieure d'intégration
int NumReturn; //nombre de points de retour
int NumIntervals; //nombre d'intervalles d'intégration
TNVector8 TValues; //résultat (tableau de 100 valeurs)
TNVector8 XValues; //résultat


public:

virtual float F1AIntegrer(float t, float x);
//fonction du premier ordre à intégrer
//fonction virtuelle qui doit être surchargée

EquaDif(); //initialise les conditions d'intégrations nulles
~EquaDif();

char Integre1erOrdre(float xi);
//intègre l'équation x'=F1AIntegrer(t,x)
//(xi est la valeur de x(t0))

void SoitCondIntegration(float ll,float ul,int nr,int ni);
//fourni les conditions d'intégration

void DonneResultats(TNVector8 &t, TNVector8 &x);
//délivre ldes résultats sous forme de tableaux
};

class circuit : public EquaDif
{protected :
float vs;
source *s;

public :
float signal(float t);
virtual int integre()=0;
circuit();
~circuit();
void change_source(source *s);
};

class cordre1 : public circuit
{protected :
float x0;
public :
int integre();
cordre1();
~cordre1();
};

class circuit_a : public cordre1
{protected :
float r1,c1;
public :

float F1AIntegrer(float t,float x);

void dcircuit_a(float res1,float cond1);
circuit_a();
~circuit_a();
};

voila les .cpp:

char EquaDif::Integre1erOrdre(float xi){
int i;
float p1,p2,p3,p4;
float h;

TValues[0]=LowerLimit;
XValues[0]=xi;
h=(UpperLimit-LowerLimit)/NumIntervals;

for(i=0;i<=NumIntervals;i++){//methode de Runge-Kutta
p1= F1AInteger(TValues[i],XValues[i]);
p2= F1AInteger(TValues[i]+h/2,XValues[i]+h/2*p1);
p3= F1AInteger(TValues[i]+h/2,XValues[i]+h/2*p2);
p4= F1AInteger(TValues[i]+h,XValues[i]+h*p3);
TValues[i+1]=TValues[i]+h;
XValues[i+1]=XValues[i]+h/6*(p1+2*(p2+p3)+p4);
};

};

et F1AInteger est surchargée comme ca:

float circuit_a::F1AIntegrer(float t,float x)
{return (-x/(r1*c1)+(*s).signal(t)/(r1*c1));};

et Integer1erOrdre est utilisée dans:

int cordre1::integre()
{cout<<"Entrer la condition initiale sur x : ";
cin>>x0;
return(Integre1erOrdre(x0));
};

merci
  • # demande de renseignements

    Posté par (page perso) . Évalué à 3.

    Quels sont les messages du compilateur ?
    • [^] # Re: demande de renseignements

      Posté par . Évalué à 2.

      Sans le message d'erreur ca va en effet etre un peu plus dur...
      Mais il semblerait que EquaDif::Integre1erOrdre doive retourner un char (bouh! pourquoi pas plutot un std::string? et d'ailleurs a quoi il sert ce char? C'est pas courant que le resultat d'un integration soit un caractere...) et le code qui est affiché ici ne retourne rien...

      Cependant, j'emettrais deja quelques remarques d'ordre general :
      - mettre les arguments des methodes en const (ca mange pas de pain)
      - comme c'est pour du calcul numerique, je mettrais bien aussi tous les float en double...

      Et pour finir, pour s'inspirer :
      http://www.boost.org/libs/numeric/ublas/doc/overview.htm(...)
  • # Erreur de frappe ?

    Posté par . Évalué à 3.

    > et F1AInteger est surchargée comme ca:
    > float circuit_a::F1AIntegrer(float t,float x)

    Alors F1AInteger ou F1AIntegrer ?

    Comme cela ressemble à du copier-coller, je suppose que ton problème est simplement cette faute de frappe .....

    Bon courage.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.