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

  FORUM HardWare.fr
  Programmation
  C

  [AIDE] bug mon projet C

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[AIDE] bug mon projet C

n°1746424
darkius
Posté le 14-06-2008 à 15:20:53  profilanswer
 

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

mood
Publicité
Posté le 14-06-2008 à 15:20:53  profilanswer
 

n°1746427
darkius
Posté le 14-06-2008 à 15:28:53  profilanswer
 

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

n°1746431
esox_ch
Posté le 14-06-2008 à 15:33:29  profilanswer
 

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 :??: ?

n°1746432
Taz
bisounours-codeur
Posté le 14-06-2008 à 15:41:06  profilanswer
 

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.

n°1746433
darkius
Posté le 14-06-2008 à 15:42:15  profilanswer
 

j utilise Visual studio 6 sp6

n°1746434
Taz
bisounours-codeur
Posté le 14-06-2008 à 15:42:41  profilanswer
 

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

n°1746435
darkius
Posté le 14-06-2008 à 15:43:36  profilanswer
 

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

n°1746460
darkius
Posté le 14-06-2008 à 17:14:09  profilanswer
 

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
n°1746462
Taz
bisounours-codeur
Posté le 14-06-2008 à 17:26:09  profilanswer
 

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

n°1746469
esox_ch
Posté le 14-06-2008 à 18:22:54  profilanswer
 

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

mood
Publicité
Posté le 14-06-2008 à 18:22:54  profilanswer
 

n°1746470
darkius
Posté le 14-06-2008 à 18:23:54  profilanswer
 

en tout cas merci pour l'aide apporter

n°1746493
dap++
Script kiddie
Posté le 14-06-2008 à 19:30:01  profilanswer
 

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
n°1746535
esox_ch
Posté le 14-06-2008 à 21:11:55  profilanswer
 

Oué un nouveau scope quoi ...

n°1746565
sligor
Posté le 14-06-2008 à 23:50:16  profilanswer
 

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
n°1746568
darkius
Posté le 14-06-2008 à 23:54:42  profilanswer
 

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

n°1746704
Taz
bisounours-codeur
Posté le 15-06-2008 à 11:33:57  profilanswer
 

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.

n°1746707
esox_ch
Posté le 15-06-2008 à 11:37:02  profilanswer
 

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?

n°1746723
Taz
bisounours-codeur
Posté le 15-06-2008 à 13:13:47  profilanswer
 

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

n°1746726
Taz
bisounours-codeur
Posté le 15-06-2008 à 13:20:14  profilanswer
 

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

n°1746728
sligor
Posté le 15-06-2008 à 13:32:52  profilanswer
 

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.

n°1746730
Joel F
Real men use unique_ptr
Posté le 15-06-2008 à 13:36:31  profilanswer
 

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

n°1746734
Elmoricq
Modérateur
Posté le 15-06-2008 à 13:47:45  profilanswer
 

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

n°1746739
sligor
Posté le 15-06-2008 à 13:53:24  profilanswer
 

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

n°1746741
Gf4x3443
Killing perfection
Posté le 15-06-2008 à 14:01:39  profilanswer
 

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
n°1746742
Elmoricq
Modérateur
Posté le 15-06-2008 à 14:03:25  profilanswer
 

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

n°1746748
Taz
bisounours-codeur
Posté le 15-06-2008 à 14:41:42  profilanswer
 

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.

n°1746755
Joel F
Real men use unique_ptr
Posté le 15-06-2008 à 15:17:27  profilanswer
 

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 ?

n°1746757
Gf4x3443
Killing perfection
Posté le 15-06-2008 à 15:22:36  profilanswer
 

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

n°1746758
Gf4x3443
Killing perfection
Posté le 15-06-2008 à 15:25:18  profilanswer
 

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.

n°1746765
Joel F
Real men use unique_ptr
Posté le 15-06-2008 à 16:32:23  profilanswer
 

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.

n°1746791
esox_ch
Posté le 15-06-2008 à 19:35:50  profilanswer
 

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

n°1746798
Gf4x3443
Killing perfection
Posté le 15-06-2008 à 20:20:39  profilanswer
 

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
n°1746800
esox_ch
Posté le 15-06-2008 à 20:27:45  profilanswer
 

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

mood
Publicité
Posté le   profilanswer
 


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

  [AIDE] bug mon projet C

 

Sujets relatifs
un mini projet en C (j ai besoin d aide)[résolu]Classes pour faciliter l'utilisation de sockets C, en C++
[OPENGL SFML C++] Probléme executable.[C#] Imprimer le contenu d'un webBrowser
Tableau multidimension >2type d'acces dans un fichier binaire en C
[C] Probleme types de variables - DebutantProblème programmation C++
Plus de sujets relatifs à : [AIDE] bug mon projet C


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