Problème de structures

Problème de structures - C - Programmation

Marsh Posté le 26-12-2005 à 23:32:48    

Salut !
 
Bon alors je suis face à une erreur que je ne comprends pas, malgré les faq que j'arpente sur le web.
 
J'ai une structure :  
 

Code :
  1. struct element
  2.   {
  3.     char nom[20];
  4.     char symbole[4];
  5.     int numeroatomique;
  6.     double masseatomique;
  7.     double densite;
  8.     double fusion;
  9.     double vap;
  10.     double rayon;
  11.     double rayon_cov;
  12.     char rayonionique[24];
  13.   };


 
Puis j'en crée deux variables, dont une que j'initialise.
 

Code :
  1. struct element fiche_vide = {"0","0",0,0,0,0,0,0,0,"0"} ;
  2.   struct element fiche;


 
Souci, à la compilation, gcc me dit : "error : two or more data types in declaration of 'fiche_vide'".
Je vois pas le rapport, je fais pourtant comme il est indiqué dans ce cours (où y'a bien deux types différents) :  
http://www.linux-kheops.com/doc/an [...] 0000000000
Mais soit.
 
Sinon, j'essaye de faire une fonction pour laquelle j'ai besoin d'entrer en paramètre une variable de type struct element. Donc je fais  
 

Code :
  1. void lecture(struct element fiche,int numero,FILE *fichier)


 
Et j'ai droit à un warning que je saisis pas trop :  
"struct element" declared inside parameter list
its scope is only this definition or declaration, which is probably not what you want
 
Ensuite je fais un fseek dans lequel j'ai besoin de la taille de ma structure, je fais un sizeof(fiche), mais il me sort l'erreur : "'fiche' has incomplete type"
 
Voilà, je n'ai pas vraiment trouvé d'aide, donc si quelqu'un pouvait m'aiguiller sur ces différents points, ce serait sympathique, merci.

Reply

Marsh Posté le 26-12-2005 à 23:32:48   

Reply

Marsh Posté le 26-12-2005 à 23:49:56    

LorDjidane a écrit :

Souci, à la compilation, gcc me dit : "error : two or more data types in declaration of 'fiche_vide'".


 
gcc version 3.95 ici, options -W -Wall -O2 -ansi activées, pas de warning.
Le problème se situe peut-être ailleurs que dans le seul code que tu as montré.
 

LorDjidane a écrit :

Et j'ai droit à un warning que je saisis pas trop :  
"struct element" declared inside parameter list
its scope is only this definition or declaration, which is probably not what you want


 
Là encore je n'ai pas de warning.
 

LorDjidane a écrit :

Ensuite je fais un fseek dans lequel j'ai besoin de la taille de ma structure, je fais un sizeof(fiche), mais il me sort l'erreur : "'fiche' has incomplete type"


 
Là encore, je ne comprends pas l'origine de l'erreur.  
 
 
Hypothèse : au moment de la compilation il ne connait pas la définition de la structure parce qu'elle est définie ailleurs, par exemple dans un fichier en-tête non inclu ?
 
Bref, peux-tu montrer davantage de code, et nous donner tes options de compilation ?


Message édité par Elmoricq le 26-12-2005 à 23:50:30
Reply

Marsh Posté le 27-12-2005 à 00:02:29    

Bon, je n'ai plus l'erreur première.
 
Par contre pour le reste, bah je peux paster tout mon code (mais il est moche :x). J'utilise le gcc config de base avec devcpp 4.9.9.2. (je sais pas trop à quelle options ça correspond, je dév jamais sous win normalement)
 
Donc makefile de base

Code :
  1. tp08: tp08.o
  2. gcc -g -o tp08 tp08.o
  3. tp08.o: tp08.c
  4. gcc -g -c tp08.c


 
Et le code (je vire ce qui paraît inutile) :  
 

Code :
  1. #include <stdio.h>
  2. void lecture(struct element fiche,int numero,FILE *fichier)
  3. {
  4.    fseek(fichier,(numero-1)*sizeof(fiche),SEEK_SET);
  5.    fscanf(fichier,"%s %s %d %lf %lf %lf %lf %lf %lf %s",fiche.nom,fiche.symbole,fiche.numeroatomique,
  6. fiche.masseatomique,fiche.densite,fiche.fusion,fiche.vap,fiche.rayon,fiche.rayon_cov,fiche.rayonionique);
  7.    puts("Voici les informations que vous avez demande.\n\n" );
  8.    printf("1.Nom de l'atome     = %s\n",fiche.nom);
  9.    printf("2.Symbole atomique   = %s\n",fiche.symbole);
  10.    printf("3.Numero atomique    = %d\n",fiche.numeroatomique);
  11.    printf("4.Masse atomique     = %lf.3\n",fiche.masseatomique);
  12.    printf("5.Densite            = %lf.3\n",fiche.densite);
  13. }
  14. int main(int argc,char** argv)
  15. {
  16.   int numero;
  17.   FILE *fichier;
  18.  
  19.   struct element
  20.   {
  21.     char nom[20];
  22.     char symbole[4];
  23.     int numeroatomique;
  24.     double masseatomique;
  25.     double densite;
  26.     double fusion;
  27.     double vap;
  28.     double rayon;
  29.     double rayon_cov;
  30.     char rayonionique[24];
  31.   };
  32.   struct element fiche_vide = {"0","0",0,0,0,0,0,0,0,"0"} ;
  33.   struct element fiche;
  34.  
  35.   if ((fichier=fopen(argv[1],"wb" ))==NULL) return(-1);
  36.   puts("Quelle fiche consulter ?\n" );
  37.   scanf("%d",&numero);
  38.   consulter(fiche,numero,fichier);
  39.  
  40. return 0;
  41. }

Message cité 1 fois
Message édité par LorDjidane le 27-12-2005 à 00:03:35
Reply

Marsh Posté le 27-12-2005 à 00:18:49    

Déplace la définition de struct element entre ton #include et ta fonction, tu vas voir ça va aller mieux.
[:klem3i1]
 
Au passage, l'usage de fscanf tel que tu en fais-là est vraiment peu judicieux.
 
Utilise plutôt fread() pour la lecture et fwrite() pour l'écriture, vu que ta structure est de taille fixe ça passe tout seul.
 
Et n'oublie pas de contrôler le retour des fonctions que tu appelles, pour vérifier que tout se passe bien, plutôt que d'espérer que c'est le cas.  
Parce que si quelque chose cloche, ça plante.

Reply

Marsh Posté le 27-12-2005 à 00:22:15    

LorDjidane a écrit :

Voilà, je n'ai pas vraiment trouvé d'aide, donc si quelqu'un pouvait m'aiguiller sur ces différents points, ce serait sympathique, merci.


Tu ne montres que des bribes de code. Je peux affirmer que ceci est correct :  

Code :
  1. #include <stdio.h>
  2. struct element
  3. {
  4.    char nom[20];
  5.    char symbole[4];
  6.    int numeroatomique;
  7.    double masseatomique;
  8.    double densite;
  9.    double fusion;
  10.    double vap;
  11.    double rayon;
  12.    double rayon_cov;
  13.    char rayonionique[24];
  14. };
  15. static int lecture(struct element fiche, int numero, FILE *fichier)
  16. {
  17.    return 0;
  18. }
  19. int main (void)
  20. {
  21.    struct element fiche_vide = {"0", "0", 0, 0, 0, 0, 0, 0, 0, "0"} ;
  22.    struct element fiche;
  23.    return 0;
  24. }


Mais je ne sais pas comment est organisé ton code (compilation séparée, fichiers d'entêtes etc.)
 
D'après les messages d'erreur, la définition de structure n'est pas visible.


Message édité par Emmanuel Delahaye le 27-12-2005 à 00:26:53

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-12-2005 à 00:25:12    

http://www.songfight.net/gallery/data/media/7/Nicely-Toasted.gif
 
[:dawa]

Reply

Marsh Posté le 27-12-2005 à 00:26:06    

Elmoricq a écrit :

Au passage, l'usage de fscanf tel que tu en fais-là est vraiment peu judicieux.


Tu suggères donc un fgets() + sscanf() ?

Citation :

Utilise plutôt fread() pour la lecture et fwrite() pour l'écriture, vu que ta structure est de taille fixe ça passe tout seul.


Je ne vois pas pourquoi. Si les données sont encodées en texte, il n'y a pas le choix. On a pas la spec, on ne peut rien dire.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-12-2005 à 00:28:11    

Merci, c'était nul en fait (comme d'habitude).
 
On m'a tellement bassiné avec le "n'utilise pas de variables globales" que je me refusais à mettre ma structure à cet endroit. Je vais repotasser un peu mon cours.
 
Merci beaucoup à vous.

Reply

Marsh Posté le 27-12-2005 à 00:42:03    

LorDjidane a écrit :

Et le code (je vire ce qui paraît inutile) :


OK. Disons que 'lecture' s'écrit 'consulter'.  
 
Il des incohérences dans ce code. Si les données sont enregistrées au format texte,  
- d'une part, il y a peu de chance que la taille de l'enregistrement soit fixe,  
- d'autre part, cette taille n'est certainement pas sizeof(fiche).  
 
Si tu veux utiliser fseek(), Elmoric a raison, il faut enregistrer/lire au format binaire avec fwrite() / fread().  
 
Si le format des enregistrements est de type texte, (1 par ligne) avec les champs séparés par des virgules, par exemple, une lecture avec fgets() suivit d'une analyse avec sscanf() est possible (ne pas se tromper dans les types des données : *scanf() attend des adresses !). Il faut alors lire séquenciellement en comptant les enregistrements.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-12-2005 à 00:44:26    

LorDjidane a écrit :

Merci, c'était nul en fait (comme d'habitude).


Raah! Non. Il faut travailler la 'positive attitude', sinon, c'est la dépression assurée...

Citation :


On m'a tellement bassiné avec le "n'utilise pas de variables globales" que je me refusais à mettre ma structure à cet endroit. Je vais repotasser un peu mon cours.


Effectivement, la variable n'a pas à être globale. Mais la définition de structure, doit être visible de tous ceux qui en ont besoin.
 
http://forum.hardware.fr/hardwaref [...] m#t1273512


Message édité par Emmanuel Delahaye le 27-12-2005 à 00:45:18

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 27-12-2005 à 00:44:26   

Reply

Marsh Posté le 27-12-2005 à 01:25:36    

Merci pour les corrections, mais j'avais corrigé depuis.

Reply

Sujets relatifs:

Leave a Replay

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