[AIDE] bug mon projet C

bug mon projet C [AIDE] - C - Programmation

Marsh Posté le 14-06-2008 à 15:20:53    

Je ne comprend pas les erreur généré et ou le problème qu'il y a quelqu'un pourrai m'aide  
svp
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <windows.h>
  4. void saisi()
  5. {
  6. int ans;
  7. double base;
  8. double tx;
  9. system("cls" );
  10. printf("saisir le taux\n" );
  11. scanf("%lf",&tx);
  12. printf("saisir la basse d'amortisement\n" );
  13. scanf("%lf",&base);
  14. printf("saisir le nombre d anner d amortisement\n" );
  15. scanf("%d",&ans);
  16. system("cls" );
  17. printf("Saisie OK\n" );
  18. system("pause" );
  19. system("cls" );
  20. FILE *fdata_out;   // <<=== 1er erreurs
  21.                                        //'FILE' : illegal use of this type as an expression
  22.                                  // et je ne vois pas pourquoi
  23. fdata_out = fopen("data.ini","w" );
  24. fprintf(fdata_out,"%.2lf\t %.2lf\t %d\n",tx,base,ans);
  25. fclose(fdata_out);
  26. }
  27. void calcule()
  28. {
  29. int annees;
  30. double anuit;
  31. double base;
  32. int j;
  33. int i;
  34. double tx;
  35. double vc;
  36. double base2;
  37. double deg;
  38. double lin;
  39. system("cls" );
  40.  FILE *fdata_in;   // <<=== Idem ici
  41.  fdata_in = fopen("data.ini","r" );
  42.  fscanf(fdata_in,"%lf %lf %d",&tx,&base,&annees);
  43.  fclose(fdata_in);
  44. j=0;
  45. deg=(100 / annees)*tx;
  46. system("cls" );
  47. base2=base;
  48. printf("amortisement pour :\n\n" );
  49. printf(" -  %d Annee \n",annees);
  50. printf(" - %.2lf comme base d amortisement\n\n",base);
  51. printf("Annee\t|\tbase\t|\ttx degresif ( en %)\t|\ttx lineaire ( en %)\t|\t annuiter\t|\tvaleur net comptable\t|" );
  52. //if(wprint=1);
  53. //{
  54. // FILE *fiche
  55. //  fiche =fopen("./amodeg.txt","w" );
  56. //}
  57. for(i=1;i<=annees;i++)
  58. {
  59.  lin=100/(annees-j);
  60.  j=j+1;
  61.  anuit=0;
  62.  if( deg > lin)
  63.   anuit=base2*(deg/100);
  64.  else
  65.   anuit=base2*(lin/100);
  66.  vc=base2-anuit;
  67.  printf("%d",i,"\t|\t","%.2lf",base2,"\t|\t","%.2lf",deg,"\t\t|\t\t","%.2lf",lin,"\t\t\t|\t","%.2lf",anuit,"\t\t|\t\t","%.2lf",vc,"\t\t|" );
  68.  //if(wprint=1);
  69.  //{
  70.  // fwrite( char $variable,nbcar,nbcar,"amortisement.txt" );
  71.  //  fprintf(fdata,"%.2lf\t %.2lf\t %d\n",tx,base,ans);
  72.  //}
  73.  base2=vc;
  74. }
  75. //if(wprint=1);
  76. //{  
  77. // fclose(fiche);
  78. //}
  79. system("pause" );
  80. }
  81. int menu()
  82. {
  83. int _choix;
  84. system("cls" );
  85. printf("\t\t####################################################\n" );
  86. printf("\t\t#########  Calcul d'amortisement degresif  #########\n" );
  87. printf("\t\t####################################################\n" );
  88. printf("  1= Calcul avec affichage (seulement)\n" );
  89. printf("  2= Calcul avec copie dans une fichier\n" );
  90. printf("  3= saisie des information (taux nombre d'année et de la basse d'amortisement)\n" );
  91. printf("\n\n" );
  92. printf("0= quitter\n" );
  93. scanf("%d",&_choix);
  94. return _choix;
  95. }
  96. int main()
  97. {
  98. int choix;
  99. do
  100. {
  101.  choix=menu();
  102.  switch(choix)
  103.  {
  104.   case 1:calcule();
  105.     break;
  106.   case 2:calcule();
  107.     break;
  108.   case 3:saisi();
  109.     break;
  110.  }
  111. }while(choix!=0);
  112. return 0;
  113. }


 
 
Merci pour l'aide apporter

Reply

Marsh Posté le 14-06-2008 à 15:20:53   

Reply

Marsh Posté le 14-06-2008 à 15:28:53    

Merci le fait de deplacer les ligne  
FILE *variable;
en dessous des déclaration des variable ne généré plus de bug.
 
je reviendrais si j'ai d'autre souci ^^ merci

Reply

Marsh Posté le 14-06-2008 à 15:33:29    

C'est quoi la raison de ça d'ailleurs? Le compilo veut savoir combien de mémoire allouer avant de commencer le programme? Il s'en sort comment du coups avec l'allocation dynamique :??: ?

Reply

Marsh Posté le 14-06-2008 à 15:41:06    

nan mais ça c'est une limitation C89. Mais c'est pour faire des compilo plus simple à écrire j'imagine. aujourd'hui en C99 on s'en fiche: tu peux tout mélanger et c'est mieux.

Reply

Marsh Posté le 14-06-2008 à 15:42:15    

j utilise Visual studio 6 sp6

Reply

Marsh Posté le 14-06-2008 à 15:42:41    

bref: ça compile ou pas, mais si ça compile, ça ne pose aucun problème.

Reply

Marsh Posté le 14-06-2008 à 15:43:36    

avant l aide apporter par " NazzTazz " ça compiler pas
maintenant si

Reply

Marsh Posté le 14-06-2008 à 17:14:09    

heux comment on fait pour afficher le caractère "%" dans la console ???
 

Code :
  1. printf("%c",37);


^^
 
j ai une structure nommé "Tableau" et j aimerais crée un tableau de cet structure
du coup j initialise comme suivant

Code :
  1. Tableau tab[20];


pour un tableau de taille 20
mais comment faire pour un tableau de taille variable ?

Message cité 1 fois
Message édité par darkius le 14-06-2008 à 17:15:00
Reply

Marsh Posté le 14-06-2008 à 17:26:09    

malloc.
 
Element* t = malloc(n * sizeof *t);
// puis vérifier que t != NULL

Reply

Marsh Posté le 14-06-2008 à 18:22:54    

T1 je vais jamais m'y faire à ces malloc ... C'est tellement plus simple les truc style Vector de Java/C++/...

Reply

Marsh Posté le 14-06-2008 à 18:22:54   

Reply

Marsh Posté le 14-06-2008 à 18:23:54    

en tout cas merci pour l'aide apporter

Reply

Marsh Posté le 14-06-2008 à 19:30:01    

darkius a écrit :

heux comment on fait pour afficher le caractère "%" dans la console ???


Code :
  1. putchar('%');
  2. printf("%%" );
  3. puts("%" );
 
esox_ch a écrit :

C'est quoi la raison de ça d'ailleurs? Le compilo veut savoir combien de mémoire allouer avant de commencer le programme? Il s'en sort comment du coups avec l'allocation dynamique :??: ?


Tu peux déclarer des variables ailleurs mais il faut créer un nouveau bloc (en C89) :

Code :
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.    puts("Test" );
  5.  
  6.    {
  7.       int temp;
  8.    }
  9.    /* une fois sorti du bloc la variable temp n'existe plus */
  10.  
  11.    return 0;
  12. }


Message édité par dap++ le 14-06-2008 à 19:30:19

---------------
dap.developpez.com
Reply

Marsh Posté le 14-06-2008 à 21:11:55    

Oué un nouveau scope quoi ...

Reply

Marsh Posté le 14-06-2008 à 23:50:16    

esox_ch a écrit :

Il s'en sort comment du coups avec l'allocation dynamique :??: ?


Un compilateur C89 ne sait pas faire d'allocation dynamique

Message cité 1 fois
Message édité par sligor le 14-06-2008 à 23:51:04
Reply

Marsh Posté le 14-06-2008 à 23:54:42    

oui oui très bien mon projet est terminer en ce qui pour le code
me manque plus qu un rapport de 4 a 5 page a rédiger ... le plus chiant lol
 
merci a tous

Reply

Marsh Posté le 15-06-2008 à 11:33:57    

sligor a écrit :


Un compilateur C89 ne sait pas faire d'allocation dynamique


ça n'a rien à voir. mixer code et déclaration VS. VLA c'est pas du tout le même problème.

Reply

Marsh Posté le 15-06-2008 à 11:37:02    

Question :
Comment ça se fait que ces compilo C89 sont encore utilisés? Parce ce que j'ai du programmer un microcontrolleur il y a pas longtemps, et le compilo (fourni par MicroChip, le fabriquant) acceptait pas les déclarations au milieu du code ... Il y a un avantage ou c'est juste eux qui avaient pas envie de se re-écrire le truc?

Reply

Marsh Posté le 15-06-2008 à 13:13:47    

pas l'envie ou pas la nécessité.

Reply

Marsh Posté le 15-06-2008 à 13:20:14    

c'est quoi ton compilateur là ? il me semble que gcc est explicite pour ce genre de trucs

Reply

Marsh Posté le 15-06-2008 à 13:32:52    

esox_ch a écrit :

Question :
Comment ça se fait que ces compilo C89 sont encore utilisés?


A ma connaissance seul le compilateur de Sun supporte entièrement le C99. Les autres compilateurs le supportent que partiellement.
Donc pour écrire du code portable il faut écrire en C89.

Reply

Marsh Posté le 15-06-2008 à 13:36:31    

gcc toto.c -std=c99 marche farpaitement ;)

Reply

Marsh Posté le 15-06-2008 à 13:47:45    

sligor a écrit :


A ma connaissance seul le compilateur de Sun supporte entièrement le C99. Les autres compilateurs le supportent que partiellement.


 
J'crois que Sun cc ne supporte pas encore entièrement C99, pas plus que gcc ou lcc, mais qu'il s'en approche pas mal (idem pour les deux autres).

Reply

Marsh Posté le 15-06-2008 à 13:53:24    

On dévie du topic... mais comment ça se fait que les compilo mettent autant de temps à supporter cette nouvelle norme?

Reply

Marsh Posté le 15-06-2008 à 14:01:39    

sligor a écrit :

On dévie du topic... mais comment ça se fait que les compilo mettent autant de temps à supporter cette nouvelle norme?

 

Amha, c'est le support des arrays de taille variable qui doit être pénible à implémenter, avec plein de cas tordus.

 

Ca, en C99, c'est autorisé (et perso, je trouve cette idée dégueux):

 
Code :
  1. int main (void) {
  2. ...
  3. z = 256;
  4. char tmp[z];
  5. ...
  6. }
 

Ca veut dire que tu peux allouer un tableau de taille variable à l'execution sur la pile, ce qui est loin d'être une sinécure à traiter, entre les problèmes d'alignement, le fait que ca soit fait à l'execution et pas la compilation, etc.

 

Edit: et le support étendu des flottants et leurs erreurs associées.


Message édité par Gf4x3443 le 15-06-2008 à 14:05:10
Reply

Marsh Posté le 15-06-2008 à 14:03:25    

Ouais les VLA c'est une belle connerie je trouve. :/

Reply

Marsh Posté le 15-06-2008 à 14:41:42    

Elmoricq a écrit :

Ouais les VLA c'est une belle connerie je trouve. :/


bah c'est du Z: si tu ne comprends pas les limites et gains d'une fonctionnalité, tu te tires dans le pieds. Mais si tu utilises les VLA avec un n bien borné, ça devient intéressant.

Reply

Marsh Posté le 15-06-2008 à 15:17:27    

dans le genre pas mal non plus.
 

Code :
  1. void process_array( int h, int w, float tab[h][w]);


 
les VLA, ca appelle pas juste malloca ?

Reply

Marsh Posté le 15-06-2008 à 15:22:36    

Taz a écrit :


bah c'est du Z: si tu ne comprends pas les limites et gains d'une fonctionnalité, tu te tires dans le pieds. Mais si tu utilises les VLA avec un n bien borné, ça devient intéressant.


 
Certes
 
Je vois surtout venir les béotiens formés qui pondent du Java/C# (dégueux) à longueur de journée, et qui vont se retrouver à utiliser cette fonctionnalité comme ils se sont habitués à le faire dans leur langage de prédilection (et de manière sale, je parie).

Reply

Marsh Posté le 15-06-2008 à 15:25:18    

Joel F a écrit :

dans le genre pas mal non plus.
les VLA, ca appelle pas juste malloca ?


 
Ca peut. Le problème c'est que ca fait appel à des routines qui sont très machine dépendant, et les effets de bord sont dangereux.
 
Moi je vois surtout venir les mecs qui vont exploser leur pile sans comprendre.

Reply

Marsh Posté le 15-06-2008 à 16:32:23    

Gf4x3443 a écrit :


 
Ca peut. Le problème c'est que ca fait appel à des routines qui sont très machine dépendant, et les effets de bord sont dangereux.
 
Moi je vois surtout venir les mecs qui vont exploser leur pile sans comprendre.


 
Ah ça je dit pas le contraire. M'enfin, en attendant, j'ai eu sous les yeux du code indus qui fait exactement ce que j'ai montré.
Ça a l'air de marcher pas mal, mais bon c'est codé par des roxxor du Traitement du signal qui manie le -fstack-size= avec brio donc bon.
 
Enfin c'est toujours pareil, c'est un outil de plus, reste à enseigner au gens de l'utiliser proprement.

Reply

Marsh Posté le 15-06-2008 à 19:35:50    

Si je comprend bien le problème serait un peu le même qui arrive en Java & co quand tu commences à fouttre tout et n'importe quoi dans tes vecteurs en te disant que ça vaut pas la peine de créer un objet proprement pour tout stocker? Tu te manges donc des memory heap de partout..?

Reply

Marsh Posté le 15-06-2008 à 20:20:39    

esox_ch a écrit :

Si je comprend bien le problème serait un peu le même qui arrive en Java & co quand tu commences à fouttre tout et n'importe quoi dans tes vecteurs en te disant que ça vaut pas la peine de créer un objet proprement pour tout stocker? Tu te manges donc des memory heap de partout..?

 

Il est multi factoriel le problème.

 

D'un, ca ajoute une notion un peu éloignée du C, à savoir que l'on va pouvoir allouer dynamiquement de gros ensembles sur la pile. Ca pose un problème parce que:
- c'est très facile de faire des erreurs à ce niveau. Un stack overflow a des effets de bords notables, difficile à détecter car très machine dépendant. Exemple, les adresses de retour des fonctions, les paramètres passés aux fonctions... sont dans la pile.
- habitude du langage, au niveau pointeur, difficile à visualiser autrement. Et la encore, on peut prendre de très mauvaises habitudes de prog (et qui ne marchent pas nécessairement, qui plus est, alors que dans d'autres langages, ca peut marcher...).

 

Exemple qui me vient en tête:

 
Code :
  1. char * toto(int size) {
  2.       /* hey les copains, super, plus besoin de malloc(), ca fait tout tout seul! */
  3.       char * buf;
  4.       char tmp[size];
  5.       buf = tmp; /* ok, pourquoi pas... */
  6.       return buf; /* grosse connerie, sodo gravier goudron plumes */
  7. }
 

Il suffit que le gusse prennent l'habitude de tout faire "dynamiquement", facon garbage collector/allocation dynamique d'autres langages qui ont leur propre runtime, et ca va sembler valide au mec d'écrire ca. Alors que non.

 

Si le mec sait ce qu'il fait (genre en TSI, en bioinfo, ...), connait la différence entre un pointeur et un tableau, ok, pas de souci: j'approuve, moi même, je trouve que c'est utile. On peut s'astreindre de faire un appel système pour de l'allocation. On manipule des ensembles de taille variable, pour du calcul, c'est efficace, moins d'overhead à faire des appels systèmes.

 

La ou ca craint, c'est le développeur C du dimanche, qui a fait 3 semaines de C puis ensuite est passé à Java/C# ou autre, calque les comportements de ce langage au C lorsqu'il doit y revenir, et paf.

 

Les VLA c'est utile pour qui sait s'en servir. Or, c'est pas à la portée du premier béotien venu qui prétend être développeur C mais n'en fait que depuis 3 semaines. J'en ai vu.


Message édité par Gf4x3443 le 15-06-2008 à 20:23:34
Reply

Marsh Posté le 15-06-2008 à 20:27:45    

D'accord... Je vois mieux ...
Moi qui vient effectivement de Java (et qui fait du Ruby en ce moment) j'ai un mal de chien à me replonger dans ces questions d'allocation d'espace ... Et vu qu'en ce moment je prépare un examen sur les bases d'assembleur ... bein ça fait mal :D

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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