Erreur programme C AIDE

Erreur programme C AIDE - C - Programmation

Marsh Posté le 13-05-2008 à 18:53:57    

Bonjour, voilà j'ai un programme a C à faire pour les cours, cependant j'ai un pu**** d'erreur et j'arrive vraiment pas a voir ou elle est :/ ca fait bien 1H que je suis dessus ca doit vraiment etre un truc a la con je pense :/, je dois afficher des float et il me sort ca : Valeur de ty[49] : -1.#IND00, impossible de trouver :(
 
Si quelqu'un veut bien y jetter un coup d'oeil ca m'arrangerais :/ c'est la méthode d'interpolation de lagrange
 

Code :
  1. #include <stdio.h>
  2. #define Nmax 50
  3. #include <stdlib.h>
  4. typedef float pivots[Nmax];
  5. typedef float vect[5];
  6. void lecture(int *pn, pivots pl);
  7. float lag(int pn, pivots pX, pivots pY, float pal);
  8. int maximum(int pn,pivots pY);
  9. // Fonction Lecture //
  10. void lecture (int *pn, pivots pl)
  11. {
  12. float a;   
  13. int i;
  14. i=0;
  15. FILE *f1;
  16. f1 = fopen("c:/rampe1.txt","r" );
  17. if(f1==NULL)
  18. {
  19.    printf("Erreur de fichier\n" );
  20.    exit(1);       
  21. }
  22. *pn=1;
  23. while (!feof(f1))
  24. {
  25.       i++;
  26.       fscanf(f1,"%f %f %f",&a,&a,pl+i);
  27.       printf("%f\n",*(pl+i));
  28.       *pn=*pn+1;
  29.      
  30. }
  31. printf("Nombre de lignes : %d \n",*pn);
  32. }


 

ERREURS :  

Code :
  1. // Fonction lag //
  2. float lag(int pn, pivots pX, pivots pY, float pal)
  3. {
  4. int i,j;
  5. float L,x,som,pol;
  6. pol=0;
  7. for(i=0;i<pn;i++)
  8. {
  9.     L=1;
  10.     x=1;
  11.     for(j=0;j<pn;j++)
  12.     {
  13.      if(j!=i)
  14.      {
  15.      x= (pal-pX[j]) / (pX[i]-pX[j]);
  16.      L=L*x;
  17.      }
  18.     }
  19. som=L*pY[i]; 
  20. pol=pol+som;
  21. }
  22. return(pol);
  23. }


Code :
  1. // Fonction maximum //
  2. int maximum(int pn,pivots pY)
  3. {
  4. int i,b;
  5. float a;
  6. a=pY[0];
  7. for(i=1;i<pn;i++) 
  8. {
  9. if(pY[i]>a)
  10. { a=pY[i]; b=i; }
  11. }
  12. return(b);
  13. }
  14. // Fonction main //
  15. int main (void)
  16. {
  17. int a,b,i,c,g;
  18. float tt;
  19. pivots l,tx,ty;
  20. pivots PivX={0,1,2,3,4};
  21. lecture(&a,l);
  22. b=maximum(a,l);
  23. printf("\nNumero de ligne de la valeur max : %d \n",b+1);
  24. //pivots PivY={l[b-2],l[b-1],l,l[b+1],l[b+2]};
  25. pivots PivY={0,1,2,3,4};
  26. tx[0]=0;
  27. for(i=1;i<50;i++)
  28. tx[i]=tx[i-1]+0.081632653061224489795918367346939;


 
[b]Erreurs :
 

Code :
  1. for(g=0;g<50;g++)
  2. {
  3. tt=tx[g];
  4. ty[g]=lag(a,PivX,PivY,tt);
  5. printf("\nValeur de ty[%d] : %f ",g,ty[g]);
  6. }


 
 
Suite du programme

Code :
  1. c=maximum(a,ty);
  2. printf("\nNouvelle valeur du max : %f ",ty[32]);
  3. return(0);
  4. }


 
 
Désolé pour le pavé j'ai mis en gras la ou se situent les problemes, enfin je pense :/, merci de votre aide


Message édité par gilou le 13-05-2008 à 20:07:39

---------------
http://www.youtube.com/profile?user=ximothov
Reply

Marsh Posté le 13-05-2008 à 18:53:57   

Reply

Marsh Posté le 13-05-2008 à 20:12:59    

J'en sais trop rien de ce qui merde exactement, le seul truc qui me parait louche c'est ton incrément de i dans ta fonction lecture : l'indice 0 de ton tableau n'est jamais initialisé.

Reply

Marsh Posté le 13-05-2008 à 21:39:46    

cette ligne
while (!feof(f1))
est fausse, ce n'est pas comme celà qu'on teste la fin de fichier
Une méthode possible est ceci  

Code :
  1. void lecture (int *pn, pivots pl)
  2. {
  3.   char buf[256];
  4.   float a; 
  5.   int i;
  6.   i=0;
  7.   FILE *f1;
  8.   f1 = fopen("c:/rampe1.txt","r" );
  9.   if(f1==NULL)
  10.   {
  11.      printf("Erreur de fichier\n" );
  12.      exit(1);     
  13.   }
  14.   *pn=1;
  15.   while (fgets(buf, sizeof buf, f1) != NULL)
  16.   {
  17.       sscanf(buf,"%f %f %f",&a,&a,pl+i);
  18.       printf("%f\n",*(pl+i));
  19.       *pn=*pn+1;
  20.       i++;  // tpierron a raison, il faut incrémenter après la lecture  
  21.   }
  22.   printf("Nombre de lignes : %d \n",*pn);
  23.   fclose(f1);  <== il ne faut pas l'oublier
  24. }


Ce n'est peut-être pas ça l'erreur du programme que tu recherchais , mais c'en était quand même une.

Message cité 1 fois
Message édité par Trap D le 13-05-2008 à 21:40:22
Reply

Marsh Posté le 13-05-2008 à 21:48:55    

Trap D a écrit :

cette ligne
while (!feof(f1))
est fausse, ce n'est pas comme celà qu'on teste la fin de fichier
Une méthode possible est ceci  

Code :
  1. void lecture (int *pn, pivots pl)
  2. {
  3.   char buf[256];
  4.   float a; 
  5.   int i;
  6.   i=0;
  7.   FILE *f1;
  8.   f1 = fopen("c:/rampe1.txt","r" );
  9.   if(f1==NULL)
  10.   {
  11.      printf("Erreur de fichier\n" );
  12.      exit(1);     
  13.   }
  14.   *pn=1;
  15.   while (fgets(buf, sizeof buf, f1) != NULL)
  16.   {
  17.       sscanf(buf,"%f %f %f",&a,&a,pl+i);
  18.       printf("%f\n",*(pl+i));
  19.       *pn=*pn+1;
  20.       i++;  // tpierron a raison, il faut incrémenter après la lecture  
  21.   }
  22.   printf("Nombre de lignes : %d \n",*pn);
  23.   fclose(f1);  <== il ne faut pas l'oublier
  24. }


Ce n'est peut-être pas ça l'erreur du programme que tu recherchais , mais c'en était quand même une.


Ah bon t'es sur pour le test ? c'est le prof qui nous a dis ca :o


---------------
http://www.youtube.com/profile?user=ximothov
Reply

Marsh Posté le 13-05-2008 à 21:54:29    

Oh tu sais, les profs...

 

feof() est une fonction de test de fin de fichier.
Ce qui veut dire qu'elle ne sert pas à déterminer une fin de lecture. Elle permet simplement de déterminer POURQUOI une lecture s'arrête.

 

Par exemple, si la lecture s'arrête parce qu'il y a une erreur quelconque (filesystem corrompu, problème de support, etc), alors feof() retournera toujours 0 : il n'y a pas eu d'échec parce que EOF a été rencontré.

 

Bref, il faut bel et bien tester le code retour de fgets() comme Trap D l'indique (ou de toute autre fonction de lecture), PUIS, une fois sorti de ta boucle, tu pourras si tu le souhaites écrire une gestion d'erreur pour vérifier la raison de cette fin de lecture, et aviser (il y a toute une foule de cas où c'est utile de tester feof et ferror).

 

edit : au fait, si ton fichier se termine ainsi :

ceci est la dernière ligne de ton fichier\n
<EOF>


Alors la dernière itération de ta boucle traitera une ligne vide. Ton fscanf() partira dans les choux, et tu auras n'importe quoi dans tes flottants. Je parie que ton erreur est là.


Message édité par Elmoricq le 13-05-2008 à 21:56:59
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed