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

  FORUM HardWare.fr
  Programmation
  C

  Problème de structures

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de structures

n°1273500
LorDjidane
GT & PSN ID : Lordji
Posté le 26-12-2005 à 23:32:48  profilanswer
 

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.

mood
Publicité
Posté le 26-12-2005 à 23:32:48  profilanswer
 

n°1273502
Elmoricq
Modérateur
Posté le 26-12-2005 à 23:49:56  profilanswer
 

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
n°1273505
LorDjidane
GT & PSN ID : Lordji
Posté le 27-12-2005 à 00:02:29  profilanswer
 

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
n°1273510
Elmoricq
Modérateur
Posté le 27-12-2005 à 00:18:49  profilanswer
 

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.

n°1273512
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-12-2005 à 00:22:15  profilanswer
 

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/
n°1273513
Elmoricq
Modérateur
Posté le 27-12-2005 à 00:25:12  profilanswer
 

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

n°1273514
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-12-2005 à 00:26:06  profilanswer
 

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/
n°1273516
LorDjidane
GT & PSN ID : Lordji
Posté le 27-12-2005 à 00:28:11  profilanswer
 

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.

n°1273520
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-12-2005 à 00:42:03  profilanswer
 

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/
n°1273521
Emmanuel D​elahaye
C is a sharp tool
Posté le 27-12-2005 à 00:44:26  profilanswer
 

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/
mood
Publicité
Posté le 27-12-2005 à 00:44:26  profilanswer
 

n°1273522
LorDjidane
GT & PSN ID : Lordji
Posté le 27-12-2005 à 01:25:36  profilanswer
 

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


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

  Problème de structures

 

Sujets relatifs
Problème avec un script météo.problème macro dans Word
[C] problème de réallocation de la taille d'une chaine [résolu]Probleme de session
HELP probleme pour un script d'export de zone DNSLWP probleme upload fichier
Probléme d'interraction avec un boutton ...problème avec formulaire
probleme avec les tableaux html sous IEProbleme d'affichage avec les structures.
Plus de sujets relatifs à : Problème de structures


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