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 :

problème de fonctions globales


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut problème de fonctions globales
    bonjour,

    voilà j'ai quelques petits soucis avec des déclarations de fonctions ()

    en fait j'ai un fichier PlateformeJeu.h, un fichier PlateformeJeu.c et mon main.c

    dans mon fichier PlateformeJeu.h j'ai déclaré mon entete de fonction (j'ai ajouté un extern que j'avais pas au départ mais ca n'a rien changé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int AffichageTerrain(SDL_Surface *Terrain,int Ligne,int Colonne,int **Carte);
    ensuite j'ai ca dans PlateformeJeu.c (j'ai aussi rajouté le extern au cas ou mais ca n'a rien fait )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "PlateformeJeu.h"
     
     
    extern int AffichageTerrain(SDL_Surface *Terrain,int Ligne,int Colonne,int **Carte)
    {
    blabla..
    }
    et mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    #include "PlateformeJeu.h"
     
     
    tempo = AffichageTerrain(Terrain,NbLigneCarte,NbColCarte,Carte);
    warning lors de l'appel :

    main.c(71) : warning C4013: 'AffichageTerrain' undefined; assuming extern returning int
    je comprend pas...

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 116
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 116
    Par défaut
    Citation Envoyé par Estak
    dans mon fichier PlateformeJeu.h j'ai déclaré mon entete de fonction (j'ai ajouté un extern que j'avais pas au départ mais ca n'a rien changé)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    /*
    en-tete PlateformeJeu.h
    par Estak
    */
    #include "PlateformeJeu.h"

    Vous avez donc inclus le fichier d'en tête dans le fichier d'en-tête, ça s'appelle un inclusion multiple.
    Au début d'un en-tête, il faut toujours se protéger des inclusions multiples.

    par exemple pour votre header, il devrait commencer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifndef PLATEFORMEJEU
    #define PLATEFORMEJEU
     
    /*
    Definitions de fonctions
    */
     
    #endif
    De cette façon, vous êtes protégé contre les inclusions multiple, et c'est primordial quand on écrit des grands programmes de savoir se servir des instructions du préprocesseur.

    Je ne comprends pas votre fonctionnement. Est-ce que la fonction 'AffichageTerrain' fait appel à d'autres fonctions définies dans votre en-tête "PlateformeJeu.h" ? Si non, il est inutile d'inclure ce header dans le fichier de la fonction. Pouvez vous expliquer la structure de votre programme ?

  3. #3
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par kromartien
    Je ne comprends pas votre fonctionnement. Est-ce que la fonction 'AffichageTerrain' fait appel à d'autres fonctions définies dans votre en-tête "PlateformeJeu.h" ? Si non, il est inutile d'inclure ce header dans le fichier de la fonction. Pouvez vous expliquer la structure de votre programme ?
    Si tu parles de l'inclusion de PlateformeJeu.h dans PlateformeJeu.c. Si c'est utile deja car ca permet de s'assurer que la declaration et la definition de la fonction sont bien identique ce qui peut eviter des compretements indefinis.
    D'ailleurs gcc avec l'option adequate emet un warning si le fichier d'en-tete n'est pas inclus. Il attend que la fonction soit statique ou que le prototype soit visible.

    En outre il est fort probable que le header contienne egalement les definitions de type, structure, enum, etc. donc autant l'inclure de maniere systematique.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    mais comme l'a dit gl dans PlateformeJeu.c il ne faut pas d'"extern" dans la définition de la fonction.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2006
    Messages
    932
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 932
    Par défaut
    ok,

    merci de vos réponse j'ai pu modifier un peu...
    en fait j'avais fait le ifndef mais j'avais fait un copier coller d'un autre fichier.h donc c'etait le meme nom apres le ifndef ()

    j'ai donc corrigé ca mais il me reste toujours un problème :

    plateforme.c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #include "PlateformeJeu.h"
     
    int AffichageJoueur(Joueur *Joueur,int Ligne,int Colonne,int **Carte,SDL_EventType Mouvement)
    plateforme.h (j'avais deja inclus la librairie SDL mais je l'avais pas repris de mon code pour mettre ici donc pas de problème à ce niveau)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #ifndef PlateformeJeu_H
    #define PlateformeJeu_H
     
    #include <SDL/SDL.h>
    #include "Structures.h"
     
    //déclaration des entetes
    void pause();
    extern int AffichageTerrain(SDL_Surface *Terrain,int Ligne,int Colonne,int **Carte); // VOIR CE QUE CA RENVOIT SI non succes !
    extern int AffichageJoueur(Joueur *Joueur,int Ligne,int Colonne,int **Carte,SDL_EventType Mouvement);
     
    #endif
    dans mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    achanger=AffichageJoueur(&Player,NbLigneCarte,NbColCarte,Carte,NULL);
    j'ai 2 warning sur cette ligne :

    main.c(72) : warning C4047: 'function' : 'int ' differs in levels of indirection from 'void *'
    main.c(72) : warning C4024: 'AffichageJoueur' : different types for formal and actual parameter 5
    est ce que c'est à cause de mon NULL ? car je pense qu'on peut ecrire comme ca...(pour le second warning)

    mais le premier je comprend pas pourquoi il me parle d'un void * car j'ai ca nulle part

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Elstak
    est ce que c'est à cause de mon NULL ? car je pense qu'on peut ecrire comme ca...(pour le second warning)
    Probablement, NULL ne doit etre utilise que pour les pointeurs, pas pour autre chose

    Citation Envoyé par Elstak
    mais le premier je comprend pas pourquoi il me parle d'un void * car j'ai ca nulle part
    Ben si, le NULL qui dit etre definit dans ton cas par (void*)0

  7. #7
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Elstak
    dans mon fichier PlateformeJeu.h j'ai déclaré mon entete de fonction (j'ai ajouté un extern que j'avais pas au départ mais ca n'a rien changé)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int AffichageTerrain(SDL_Surface *Terrain,int Ligne,int Colonne,int **Carte);
    extern n'est pas vraiment utile, mais c'est tout a fait correct.

    Par contre:
    * Il n'y a pas de protection contre les inclusions multiples.
    * Il manque au moins l'inclusion d'un autre fichier d'en-tete car SDL_Surface n'est pas connu.

    Citation Envoyé par Elstak
    ensuite j'ai ca dans PlateformeJeu.c (j'ai aussi rajouté le extern au cas ou mais ca n'a rien fait )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #include "PlateformeJeu.h"
     
     
    extern int AffichageTerrain(SDL_Surface *Terrain,int Ligne,int Colonne,int **Carte)
    {
    blabla..
    }
    Ici il ne faut pas d'extern.

    Citation Envoyé par Elstak
    et mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    #include "PlateformeJeu.h"
     
    tempo = AffichageTerrain(Terrain,NbLigneCarte,NbColCarte,Carte);
    warning lors de l'appel :
    main.c(71) : warning C4013: 'AffichageTerrain' undefined; assuming extern returning int
    je comprend pas...
    Dans le peu de code que tu donnes, je ne vois pas de probleme.
    As-tu d'autres erreurs ou warning lors de la compilation ?
    N'aurais tu pas un ifdef ou ifndef mal place qui masque le prototype ?

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

Discussions similaires

  1. [MFC][WINSOCK] Problème avec fonction recv
    Par Le Farfadet dans le forum MFC
    Réponses: 4
    Dernier message: 23/09/2005, 11h00
  2. Problème de fonction
    Par Anduriel dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 26/05/2005, 20h30
  3. Problème avec fonction d'envoie de mail
    Par zyg dans le forum Réseau/Web
    Réponses: 1
    Dernier message: 23/02/2005, 08h48
  4. [Requête] Problème avec fonction "DATE_FORMAT()"
    Par sekiryou dans le forum Requêtes
    Réponses: 4
    Dernier message: 11/01/2005, 21h52
  5. Fichier de fonctions globales
    Par PEM dans le forum C++Builder
    Réponses: 5
    Dernier message: 10/07/2002, 21h35

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