2xyo 2*yo = yoyo | Bonjour,
Je réalise un programme en C qui réalise des opérations sur des polynômes définis tels que :
Code :
- typedef unsigned int uint;
- struct Polynome /*On définit la structure polynome */
- {
- uint Degre; /* Un entier non signé pour le degré */
- double *Coefficients; /* Un tableau de double pour les coefficients */
- };
|
La plupart des fonctions fonctionnent (enregistrement d'un polynome, chargement à partir d'un fichier binaire, lecture d'un fichier binaire, calcul en x=?, dérivé, etc...).
J'ai cependant un problème lorsque je calcul le signe avec ma fonction double Eval(struct Polynome *p, double x) qui me calcul la valeur du polynôme en un point.
J'utilise la fonction Roots pour calculer approximativement quand le polynôme s'annule. Cette fonction fait appel à Eval et il n'y a pas de problèmes. Cependant lorsque j'appelle de nouveau Eval dans une autre fonction, ça plante. Eval veut lire un polynôme à une adresse nulle... Pourquoi ?
La fonction Sign prend "mal" mon polynome en argument (Breakpoint 1, Sign (p=0x0, x1=-5, x2=5) at aau.c:242), Pourquoi ?
Le programme est compilé avec ces options : gcc -g aau.c -o aau -lm -Wall
La sortie du gdb :
Code :
- Starting program: /home/yoyo/c/aau/aau
- Groupe2
- ############
- On declare un polynome p1
- On declare un polynome p2 demande à l'utilisateur
- Quel est le degre du polynome ? : 2
- Coefficient 0 : 2
- Coefficient 1 : 3
- Coefficient 2 : -2
- On declare un polynome p3 charge a partir d'un fichier
- 1.000000 + 2.000000 x + 3.000000 x^2 + 4.000000 x^3 + 5.000000 x^4 + 6.000000 x^5
- On declare un polynome p4=p1*p2
- 4.000000 + 12.000000 x + 1.000000 x^2 - 12.000000 x^3 + 4.000000 x^4
- ########f(-0.500000)=0.000000 out[0]=-0.500000
- ########f(2.000000)=-0.000000 out[1]=2.000000
- On affiche le signe de p4 sur [-5;5]
- Breakpoint 1, Sign (p=0x0, x1=-5, x2=5) at aau.c:242
- 242 out[N]=Roots(p,x1,x2,out);
- (gdb) s
- Roots (p=0x0, x1=-5, x2=5, out=0xbf8c4fc8) at aau.c:186
- 186 int n=0;
- (gdb) s
- 187 int signe=0,signeavant=0,j;
- (gdb) s
- 188 double i=0.;
- (gdb) s
- 189 if(Eval(p,x1)>0)
- (gdb) s
- Eval (p=0x0, x=-5) at aau.c:175
- 175 double out=0;
- (gdb) s
- 177 for(i=0;i<=p->Degre;i++)
- (gdb) s
- Program received signal SIGSEGV, Segmentation fault.
- 0x08048a31 in Eval (p=0x0, x=-5) at aau.c:177
- 177 for(i=0;i<=p->Degre;i++)
- (gdb) print p
- $1 = (struct Polynome *) 0x0
- (gdb)
|
Le programme :
Code :
- /*
- *
- * Groupe 2
- * Vim 7.1.138
- * gcc 4.2.3
- */
- #include <stdio.h> /*On inclue les librairies standards */
- #include <math.h>
- #include <stdlib.h>
- #include <float.h>
- #define N 100
- typedef unsigned int uint; /*On définit les entiers non signés par uint*/
- struct Polynome /*On définit la structure polynome */
- {
- uint Degre; /* Un entier non signé pour le degré */
- double *Coefficients; /* Un tableau de double pour les coefficients */
- };
- // Fonctions donnees
- double Pow(double x, uint p);
- struct Polynome *Allocate(unsigned int degre);
- void Delete(struct Polynome *p);
- void Display(struct Polynome *p);
- struct Polynome *Multiply(struct Polynome *p1, struct Polynome *p2);
- // Fonctions a completer
- struct Polynome *Prompt(void);
- struct Polynome *Load(char *filename);
- void Save(struct Polynome *p, char *filename);
- double Eval(struct Polynome *p, double x);
- uint Roots(struct Polynome *p, double x1, double x2, double *out);
- struct Polynome *Derivate(struct Polynome *p);
- void Sign(struct Polynome *p, double x1, double x2);
- void Variation(struct Polynome *p, double x1, double x2);
- double Eval(struct Polynome *p, double x)
- {
- double out=0;
- int i;
- for(i=0;i<=p->Degre;i++)
- {
- out=out+p->Coefficients[i]*pow(x,(float)i);
- }
- return out;
- }
- uint Roots(struct Polynome *p, double x1, double x2, double *out)
- {
- int n=0;
- int signe=0,signeavant=0,j;
- double i=0.;
- if(Eval(p,x1)>0)
- signeavant=1;
- else
- signeavant=0;
- for(j=0;j<N;j++)
- out[j]=0.0;
- for(i=x1+0.0000001;i<x2;i+=0.0000001)
- {
- if(Eval(p,i)>0)
- signe=1;
- else
- signe=0;
- if(signeavant!=signe)
- {
- out[n]=i;
- printf("########f(%lf)=%lf out[%d]=%lf\n",i,Eval(p,i),n,out[n]);
- n++;
- }
- //printf("#f(%lf)=%lf ; signeavant=%dsigne=%d\n",i,Eval(p,i),signeavant,signe);
- signeavant=signe;
- }
- /*for(j=0;j<N;j++)
- {
- printf("sol[%d]=%lf\n",j,out[j]);
- }*/
- return out[100];
- }
- void Sign(struct Polynome *p, double x1, double x2)
- {
- double out[N];
- out[N]=Roots(p,x1,x2,out);
- }
- int main(int argc, char **argv)
- {
- printf("\n\nGroupe2\n############\n" );
- printf("On declare un polynome p1\n" );
- struct Polynome *p1;
- p1=Allocate(2);
- p1->Degre=2;
- p1->Coefficients[0]=2;
- p1->Coefficients[1]=3;
- p1->Coefficients[2]=-2;
- printf("On declare un polynome p2 demande à l'utilisateur\n" );
- struct Polynome *p2;
- p2=Prompt();
- printf("On declare un polynome p3 charge a partir d'un fichier\n" );
- struct Polynome *p3;
- p3=Load("aau.dat" );
- Display(p3);
- printf("On declare un polynome p4=p1*p2\n" );
- struct Polynome *p4;
- p4=Allocate((p1->Degre)+(p2->Degre));
- p4=Multiply(p1,p2);
- Display(p4);
- double out[N];
- //int i;
- out[N]=Roots(p1,-3,3,out);
- /*for(i=0;i<N;i++)
- {
- printf("Racine %d : %lf\n",i,sol[i]);
- }*/
- printf("\nOn affiche le signe de p4 sur [-5;5]\n" );
- Sign(p4,-5,5);
- Delete(p1);
- Delete(p2);
- Delete(p3);
- Delete(p4);
- return 0;
- }
|
Edit : c'ets vrai c'était un peu long...
Message édité par 2xyo le 04-06-2008 à 21:25:38 ---------------
2 * yo = yoyo
|