IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Structure non reconnue.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut Structure non reconnue.
    Bonjour,
    voici mon problème :

    J'ai commencé un projet avec eclipse sous Linux en C avec l'interface graphique SDL.

    J'ai commencé à rédiger mon code main.c, son interface.c, un fichiers fish.c et leur en tête interface.h et fish.h. Jusque la pas de probleme.

    Je rajoute maintenant shoal.c et shoal.h, pas de problème jusqu'à ce que je souhaite utiliser une structure de ces fichiers dans fish.c ou inversement (les structures ont pour nom 'struct fish' et 'struct shoal'.

    En bidouillant j'arrive soit à me retrouver avec l'erreur suivante soit avec une erreur similaire mais pour 'shoal' :

    make all
    gcc -o shoal.o -c src/shoal.c -std=c99 -g -Wall -Werror -ansi -pedantic -I ./include
    In file included from src/shoal.c:13:0:
    ./include/shoal.h:17:1: erreur: unknown type name ‘Fish’


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    main.c :
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <time.h>
     
    #include <interface.h>
    #include <fish.h>
    #include <shoal.h>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
     
    fish.c :
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <math.h>
     
    #include "interface.h"
    #include "fish.h"
    #include "shoal.h"
     
    /*
     * Structure d un poisson.
     * Elle contient des variables propres aux poissons et liees a leur déplacement,
     * ainsi qu a leur status.
     */
    struct fish{
        double weight;
        double size;
        double speed;
        double color;
        double champVision;
        double champDisplacement;
        Position position;
        Position direction;
        int boolShoal;
    };
     
    /*
     * Structure d une position.
     * Elle contient l abscisse et l ordonnee d un point.
     */
    struct position{
        int x;
        int y;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fish.h :
     
    #include <SDL/SDL.h>
     
    typedef struct fish *Fish;
    typedef struct position *Position;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    shoal.c
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
     
    #include "interface.h"
    #include "shoal.h"
    #include "fish.h"
     
    /*
     * Structure d un banc de poissons.
     * Elle contient des poissons, le nom du chef du banc leur nombre.
     */
    struct shoal{
    	Fish *tabShoal;
    	Fish chief;
    	int nbrFish;
    };
     
    /*
     * Structure de bancs de poissons.
     * Elle contient des bancs de poissons et leur nombre.
     */
    struct shoals{
    	Shoal *tabShoals;
    	int nbrShoals;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    shoal.h :
     
    typedef struct shoals *Shoals;
    typedef struct shoal *Shoal;
    Et voici mon makefile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    PREFIX= .
     
    INCDIR = $(PREFIX)/include
    SRCDIR = $(PREFIX)/src
     
    #le compilateurs
    CC= gcc
     
    #les flags de compilation
    CFLAGS= -std=c99 -g -Wall -Werror  -ansi -pedantic
     
    #les flags du preprocesseur 
    CPPFLAGS= -I $(INCDIR)
     
    #les flags de l'editeur de liens 
    LDFLAGS= -L -L/usr/lib64 -lSDL -lpthread
     
    #les librairies utilisees 
    LDLIBS= -lm
     
    #Les fichiers objets a inserer dans la bibliotheque
    LIBOBJS= fish.o shoal.o interface.o main.o
     
    OUTFILE= testPoisson
     
    #les dependances 
    all: $(OUTFILE)
     
    $(OUTFILE): $(LIBOBJS)
    	$(CC) -o $@ $^ $(LDFLAGS) $(CPPFLAGS)
     
    fish.o: $(SRCDIR)/fish.c
    	$(CC) -o $@ -c $< $(CFLAGS)	$(CPPFLAGS)
     
    shoal.o: $(SRCDIR)/shoal.c
    	$(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS)
     
     
    interface.o: $(SRCDIR)/interface.c
    	$(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS)
     
     
    main.o: $(SRCDIR)/main.c 
    	$(CC) -o $@ -c $< $(CFLAGS) $(CPPFLAGS)
     
    clean :
    	rm -f  $(OUTFILE) $(LIBOBJS)
    Merci à tout ceux qui pourront m'aider cela fait 2jours que je suis bloqué par cette erreur...

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tes fichiers d'en-tête ne contiennent pas de garde d'inclusion ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #ifndef MON_FICHIER_H
    #define MON_FICHIER_H
     
    // blabla
     
    #endif

  3. #3
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    Si bien sur mais pour limiter la place des codes je les ai retiré.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par PunkFloyd91 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    fish.h :
     
    #include <SDL/SDL.h>
     
    typedef struct fish *Fish;
    typedef struct position *Position;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    shoal.h :
     
    typedef struct shoals *Shoals;
    typedef struct shoal *Shoal;
    Tu déclares Fish comme struct fish*, et tu utilises des Fish* (soit des struct fish**), est-ce bien ce que tu souhaites ?

    Concernant l'erreur, j'ai l'impression que tu fais un typedef avant la déclaration de la structure. (fish.c > include fish.h avec les typedef > finir la lecture de fish.c avec l'implémentation).
    D'ailleurs, pourquoi faire l'implémentation de la structure dans le .c et non le .h ? Ta structure ne sera pas utilisée en dehors ? Dans ce cas, pourquoi faire des typedef ?
    Une structure doit être déclarée dans le .h pour que son inclusion permette son utilisation.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    (EDIT : après un test rapide, ça n'a pas du tout l'air d'être ça....)

    Citation Envoyé par Bousk Voir le message
    Concernant l'erreur, j'ai l'impression que tu fais un typedef avant la déclaration de la structure.
    C'est très probablement cela puisque dans le fichier fish.c, l'inclusion de fish.h est faite avant la déclaration de la structure fish.

    Ainsi, le code généré par le pré-processeur sera :

    Code fish.c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    typedef struct fish *Fish;
    typedef struct position *Position;
     
    /*
     * Structure d un poisson.
     * Elle contient des variables propres aux poissons et liees a leur déplacement,
     * ainsi qu a leur status.
     */
    struct fish{
        double weight;
        double size;
        double speed;
        double color;
        double champVision;
        double champDisplacement;
        Position position;
        Position direction;
        int boolShoal;
    };
     
    /*
     * Structure d une position.
     * Elle contient l abscisse et l ordonnee d un point.
     */
    struct position{
        int x;
        int y;
    };

    On retrouve un problème similaire dans shoal.c.

    Le problème décrit est que l'erreur est soit sur fish soit sur shoal. Puisque le problème d'ordre apparait dans les 2 fichiers, l'apparition de l'erreur sur fish ou sur shoal dépend probablement de l'ordre de compilation des unités, non ?


    PS : dans le cas d'un problème de compilation, ne modifie pas le code pour le poster :les numéros de lignes des erreurs de compilation s'en trouvent invalidés

  6. #6
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    Dans mon code je n'utilise que des Fish et non Fish*, le typedef me permet de simplifier le code sans me préoccuper des pointeurs sur les structures.

    J'ai donc mis toutes mes structures dans les fichiers "headers" et essayer de placer mes structures avant et apres les typedef mais cela ne change en rien mon rapport d'erreur.

    en incluant "fish.h" dans "shoal.h" et "shoal.h" dans "fish.h" j'obtient l'erreur :


    **** Build of configuration Default for project SimulationPoissons ****

    make all
    gcc -o fish.o -c src/fish.c -std=c99 -g -Wall -Werror -ansi -pedantic -I ./include
    In file included from src/fish.c:14:0:
    ./include/fish.h:65:45: erreur: unknown type name ‘Shoals’
    make: *** [fish.o] Erreur 1

    **** Build Finished ****

  7. #7
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    Je pense comprendre mon erreur grâceà votre aide.

    En effet le fichier "fish.c" est lu, puis "fish.h" et la dans mes prototypes de fonction il ne comprend pas les parametres de type "Shoals" car il n'a pas encore lu le fichier "shoal.h" :
    j'ai droit dans le cas à l'erreur unknown type name ‘Shoals’.

    Dans le cas ou je fais appel en premier lieu a "shoal.h" dans "fish.c", même erreur mais maintenant pour "Fish".

    Comment y remédier s'il vous plait ? j'ai regroupé toutes mes structures dans fish.h, ça marche et je vous en remercie grandement. Seulement n'y a t-il pas une meilleure solution ? J'aurai aimé gardé mes structures Shoals et Shoal dans le fichier "shoal.h" pour soucis de clarté

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par PunkFloyd91 Voir le message
    Dans mon code je n'utilise que des Fish et non Fish*, le typedef me permet de simplifier le code sans me préoccuper des pointeurs sur les structures.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct shoal{
    	Fish *tabShoal;
    	Fish chief;
    	int nbrFish;
    };
    Si ça c'est pas un Fish* .
    A titre personnel, je n'aime pas avoir un pointeur caché par un typedef, c'est le meilleur moyen pour que j'oublie de le libérer^^.


    Citation Envoyé par PunkFloyd91 Voir le message
    En effet le fichier "fish.c" est lu, puis "fish.h" et la dans mes prototypes de fonction il ne comprend pas les parametres de type "Shoals" car il n'a pas encore lu le fichier "shoal.h" :
    j'ai droit dans le cas à l'erreur unknown type name ‘Shoals’.

    Dans le cas ou je fais appel en premier lieu a "shoal.h" dans "fish.c", même erreur mais maintenant pour "Fish".
    Tu as maintenant à faire à un problème d'inclusion cyclique
    shoal.h inclus fish.h qui inclus shoal.h

    Tu as compris la source du souci, et la solution est : forward declaration.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  9. #9
    Membre habitué
    Femme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2011
    Messages : 10
    Par défaut
    A oui je n'avais pas fais attention au Fish *, en effet c'est peut être dangereux je vas essayer de corriger le tir.

    Merci pour l'aide, RESOLU !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Structure non reconnue
    Par arthson dans le forum Langage
    Réponses: 4
    Dernier message: 25/01/2014, 16h06
  2. Structure non reconnue pour la sérialisation
    Par bbword dans le forum Débuter
    Réponses: 1
    Dernier message: 20/01/2014, 09h34
  3. Constantes et autre Structures non reconnue [API Windows]
    Par LeFoUvErT dans le forum Dev-C++
    Réponses: 3
    Dernier message: 15/09/2007, 11h48
  4. xslt_create() non reconnu
    Par BRAUKRIS dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 11/12/2003, 14h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo