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 :

d'inclusion cyclique et makefile


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut d'inclusion cyclique et makefile
    Bonjour

    J'ai un problème d'inclusion cyclique...
    Je sais que le probléme à été traité plusieurs fois mais je n'ai pas réussi à mettre en
    place la solution sauf si le problème vient d'ailleur

    voici la situation : -> sinifiant 'fait référence'

    liste -> widget
    widget -> top
    top -> liste

    J'ai donc procédé comme ceci :

    Faire une déclaration anticipé dans liste .
    Dans liste.h
    typedef struct widget ;

    Dans liste.c
    #include "liste.h"
    #include "widget.h"

    J'ai cette erreur à la compilation.
    Using Makefile from ~/Bureau/SDL_GTK
    make: entrant dans le répertoire « /home/vincent/Bureau/SDL_GTK »
    gcc -c top.c -Wall -Wextra
    In file included from top.h:10,
    from top.c:1:
    liste.h:7: warning: useless storage class specifier in empty declaration
    liste.h:11: error: expected specifier-qualifier-list before ‘Widget’
    make: quittant le répertoire « /home/vincent/Bureau/SDL_GTK »
    liste.h:24: error: expected declaration specifiers or ‘...’ before ‘Widget’
    liste.h:25: error: expected specifier-qualifier-list before ‘Widget’
    liste.h:31: error: expected declaration specifiers or ‘...’ before ‘Widget’
    liste.h:33: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘*’ token
    In file included from top.c:1:
    top.h:12: warning: empty declaration with storage class specifier does not redeclare tag
    make: *** [top.o] Erreur 1
    Voici le début des fichiers concernés :

    liste.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
     
    #ifndef liste_h
    #define liste_h
     
    #include <stdlib.h>
     
    //#include "widget.h"
    typedef struct Widget;
     
    typedef struct Maillon
    {
    	Widget * widget ;
    	struct Maillon * next ; 
    	struct Maillon * prev ;
    } Maillon ;
     
    typedef struct Liste
    {
    	// membre
    	Maillon * last ;
    	Maillon * first ;
    	int size ;
     
    	// méthode
            void (*append) (struct Liste *, Widget * );
     	Widget * (*get)	(struct Liste *, int );
    	int (*vide) (struct Liste * );
    	int (*get_size)(struct Liste * );
    } Liste;
    liste.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #include "liste.h"
    #include "widget.h"
    widget.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
     
    #ifndef widget_h
    #define widget_h
     
    #include <SDL/SDL.h>
     
    #include "top.h"
     
    typedef struct Widget 
    {
    	SDL_Surface * _surface ;
    	Top * _master ;
    	int (*get_height) () ;
    	int (*get_width) () ;
    } Widget ;
    widget.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include "widget.h"
    top.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef top_h
    #define top_h
     
    #include <stdio.h>
    #include <stdlib.h>
     
    #include <SDL/SDL.h>
    #include <SDL/SDL_ttf.h>
     
    #include "liste.h"

    top.c

    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
     
    all :: test
     
    liste.o : liste.c liste.h
    	gcc -c liste.c -Wall -Wextra
     
    top.o : top.c top.h
    	gcc -c top.c -Wall -Wextra
     
    widget.o : widget.c
    	gcc -c widget.c -Wall -Wextra
     
    label.o : label.c label.h 
    	gcc -c label.c -Wall -Wextra
     
    test : test.c top.o label.o widget.o liste.o
    	gcc -o test test.c top.o label.o widget.o liste.o -lSDL -lSDL_ttf
     
    clean ::
    	rm -rf *.o
     
    mrproper :: clean
    	rm -rf test
    merci d'avance.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2008
    Messages
    187
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Octobre 2008
    Messages : 187
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    liste.h:7: warning: useless storage class specifier in empty declaration
    Que dit ce message d'erreur ? La définition de type à la ligne 7 ne déclare rien (empty declaration). Il s'agit simplement d'une erreur de syntaxe, remplace :

    par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef struct Widget Widget;

  3. #3
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    merci de ton aide mais si je remplace Il dit que Widget est déclaré deux fois.

    widget.h:14: error: redefinition of typedef ‘Widget’
    liste.h:7: note: previous declaration of ‘Widget’ was here
    Je peux sinon faire un fichier widget_bis.h ? Cela ne sera pas pratique mais je vais quand même tester.
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  4. #4
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    J'ai trouvé une solution qui me semblait bonne elle marche mais n'est pas envisageable

    Je remplace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct Maillon
    {
    	Widget * widget ;
    	struct Maillon * next ; 
    	struct Maillon * prev ;
    } Maillon ;
    par

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    typedef struct Maillon
    {
    	 struct  // Widget
    	{
    		SDL_Surface * _surface ;
    		Top * _master ;
    		int (*get_height) () ;
    		int (*get_width) () ;
    	} * widget ;
    	struct Maillon * next ; 
    	struct Maillon * prev ;
    } Maillon ;
    Je me trouve alors devant un cycle Liste -> Top -> Liste
    Je peux aussi créer une structure sans étiquette pour Top mais Top fait référence à liste et liste à widget ...
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

  5. #5
    Membre chevronné
    Avatar de vincent.mbg
    Homme Profil pro
    Développeur Python
    Inscrit en
    Décembre 2007
    Messages
    327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Python

    Informations forums :
    Inscription : Décembre 2007
    Messages : 327
    Par défaut
    C'est bon j'ai trouvé la solution

    Ca ne marche pas avec typedef il faut faire comme ceci

    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
     
    #ifndef liste_h
    #define liste_h
     
    #include <stdlib.h>
     
    //#include "widget.h"
    struct Widget;
     
    typedef struct Maillon
    {
    	struct Widget * widget ;
    	struct Maillon * next ; 
    	struct Maillon * prev ;
    } Maillon ;
    Mon guide pour apprendre Tkinter - N'oubliez pas de consulter les FAQ Python ou de visiter mon blog

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

Discussions similaires

  1. Typedef et inclusion cyclique
    Par Johjo dans le forum Langage
    Réponses: 7
    Dernier message: 22/10/2010, 14h33
  2. probleme inclusion cyclique avec namespace
    Par befalimpertinent dans le forum C++
    Réponses: 4
    Dernier message: 27/05/2010, 09h52
  3. inclusion cyclique et compilation
    Par qertbu65 dans le forum C++
    Réponses: 10
    Dernier message: 11/05/2010, 15h36
  4. problème inclusion cyclique
    Par marion5515 dans le forum Débuter
    Réponses: 7
    Dernier message: 20/05/2009, 13h53
  5. Inclusion cyclique: mauvaise analyse?
    Par zabibof dans le forum C++
    Réponses: 4
    Dernier message: 12/09/2007, 16h36

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