Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
661 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Erreur programme C AIDE

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Erreur programme C AIDE

n°1731299
ximothov
Posté le 13-05-2008 à 18:53:57  profilanswer
 

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
mood
Publicité
Posté le 13-05-2008 à 18:53:57  profilanswer
 

n°1731325
tpierron
Posté le 13-05-2008 à 20:12:59  profilanswer
 

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é.

n°1731342
Trap D
Posté le 13-05-2008 à 21:39:46  profilanswer
 

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
n°1731347
ximothov
Posté le 13-05-2008 à 21:48:55  profilanswer
 

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

n°1731350
Elmoricq
Modérateur
Posté le 13-05-2008 à 21:54:29  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Erreur programme C AIDE

 

Sujets relatifs
Faire l agorithme dun programme[C] Bon en C ? Aidez moi !
de l aide pour un debutantApprendre C++
Aide code VBA -calcul Moyenne mobile-[C] Connection à un serveur mail
gérer une fonction d'un programme automatiquement?Prononcer C#
svp aide moi sur ce programe en pascal 
Plus de sujets relatifs à : Erreur programme C AIDE


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR