Problème Calcul d'un Delta
Bonjour,
J'ai un bug que je n'arrive pas à corriger car ce n'est pas mon code à la base.
Voilà le problème :
J'ai un opérateur Delta qui calcule la différence entre 2 valeurs consécutives d'un paramètre FRAME qui incrémente de 1 à chaque fois.
Le problème est que si je calcule le résultat des 2 paramètres a et b :
A = (+ (DELTA FRAME) (DELTA FRAME)(DELTA FRAME))
B = (DELTA (+ FRAME FRAME FRAME))
Le problème est que lorsque je lance mon programme :
J'obtient :
FRAME=0 ; a=X ; b=X puis
FRAME=1 ; a=X ; b=3 puis
FRAME=2 ; a=X ; b=3 puis
FRAME=3 ; a=3 ; b=3
La question est : Pourquoi l'écriture du paramètre A a besoin de 3 incrémentations du FRAME pour donner un résultat alors que le paramètre B non ?
Voilà le code en question:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| double Delta::evalue(DecomBoolean temps_reel, unsigned char& erreur)
{
double valeur;
double result = 0;
valeur= argument->evalue(temps_reel, erreur);
/* on sélectionne les variables concernées */
if (IsRealTime(temps_reel))
traitement_d(ancienne_erreur, ancienne_valeur, valeur, result, erreur);
else
traitement_d(ancienne_erreurdiff, ancienne_valeurdiff, valeur, result, erreur);
return result;
}
void traitement_d(int& une_erreur, double& une_valeur, double& valeur, double& result, unsigned char& erreur)
{
if (erreur == 0)
{
if (une_erreur == 0)
/* si il n'y a pas d'erreur cette fois ci et la fois précédente */
result = valeur - une_valeur;
else
{
/* si le traitement précédent était invalide */
une_erreur= 0;
erreur= 1;
}
une_valeur= valeur;
}
else
une_erreur= 1;
}
void calcule(unsigned char& erreur, TArbre p, double& resultat, double temp, DecomBoolean temps_reel)
{
if (erreur == 0)
{
temp= p->evalue(temps_reel, erreur);
if (erreur == WITHOUT_ERROR)
resultat= resultat + temp;
else
resultat= 0;
}
}
const char *Somme::ClassName()
{return "TSomme";}
double Somme::evalue(DecomBoolean temps_reel, unsigned char& erreur)
{
double resultat;
double temp=0;
int i;
double result = 0;
resultat= 0;
for (i= 0;(i <= (arguments->Count - 1));i++)
calcule(erreur, TArbre(arguments->items(i)), resultat, temp, temps_reel);
if (erreur == WITHOUT_ERROR)
result= resultat;
else
result= 0;
return result;
} |
Merci bien d'avance pour toute l'aide que vous pouvez m'apporter