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 :

Besoin d'explication (erreur C4013)


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut Besoin d'explication (erreur C4013)
    Bonjour,
    J'ai actuellement un "problème" ; pourquoi "problème" entre guillemets ? parce que j'ai réussi à trouver un moyen de passer outre.
    Je ne comprend juste pas pourquoi ça ne marche pas et ça m' énerve

    voilà la fonction que j'essaye d'appeller :
    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
    void AI (AABB joueur, AABB ecran)
    {
    	AABB mob;
     
    	mob.surface = SDL_CreateRGBSurface (SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
    	SDL_FillRect (mob.surface, NULL, SDL_MapRGB(ecran.surface->format, 50, 50, 50));
     
    	mob.pos.x = 400;
    	mob.pos.y = 400;
     
     
    	if (mob.pos.x > joueur.pos.x + joueur.surface->w)
    		mob.pos.x--;
    	if (mob.pos.x + mob.surface->w < joueur.pos.x)
    		mob.pos.x++;
    	if (mob.pos.y > joueur.pos.y + joueur.surface->h)
    		mob.pos.y--;
    	if (mob.pos.y + mob.surface->h < joueur.pos.y)
    		mob.pos.y++;
     
    	SDL_BlitSurface (mob.surface, NULL, ecran.surface, &mob.pos);
    }
    avec le fichier AI.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <SDL.h>
     
    void AI (AABB joueur, AABB ecran);
     
    typedef struct //variable utilisée pour les collisions
    {
    	SDL_Surface *surface;
    	SDL_Rect pos;
    }AABB;
    je l'appelle dans mon main avec un bête :

    Cependant quand je compile il me donne cette erreur
    warning C4013: 'AI' non défini(e)*; extern retournant int pris par défaut

    et evidemment la fonction ne fais pas effet.

    Je souhaiterais juste savoir pourquoi ça ne marche pas de cette manière, alors que ça marche quand je met le header dans le fichier main. Je précise que j'ai bien mis le include du fichier contenant la fonction dans le fichier main. (d'ailleurs une question me viens : est-ce que l'ordre des includes influe quelque chose dans le code ?)

    Je vous remercie d'avance pour vos réponses

  2. #2
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Premiere remarque : il vaut mieux declarer la structure avant de l'appeler. Donc ton fichier header devrait plutot ressembler a ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <SDL.h>
     
    typedef struct //variable utilisée pour les collisions
    {
    	SDL_Surface *surface;
    	SDL_Rect pos;
    }AABB;
     
    void AI (AABB joueur, AABB ecran);
    Juste comme ca, as-tu bien inclus ce fichier header dans ton main ?

    (d'ailleurs une question me viens : est-ce que l'ordre des includes influe quelque chose dans le code ?)
    J'aurais tendance a dire que non, mais si jamais il y a une interdependance entre 2 headers ca te le signalera. Ce genre de probleme survient plutot en c++.

    EDIT: je viens de tomber sur ce post :

    Citation Envoyé par gangsoleil
    Attention, en C il est déconseillé de nommer quelque chose avec une majuscule : tout ce qui commence par un underscore et une majuscule est un identifant reservé (7.1.3 de la norme C99), et tout ce qui commence par E suivi d'une autre majuscule (ou d'un chiffre) est potentiellement utilisé pour les erreurs (errno.h), de meme pour FE_ suivi d'une majuscule (virgule flottante), LC_ majuscule (locale.h), FP_ majuscule (math.h), SIG majuscule et SIG_ majuscule (signal.h).

    Apres, si on considere qu'un objet peut contenir des attributs et des fonctions, alors non le C n'est pas oriente objet, meme s'il est tout a fait possible d'ecrire de telles choses en C.
    Dans ce topic. Tu devrais peut-etre y jeter un coup d'oeil.

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    Merci de la réponse,

    J'ai remplacé les majuscules par des minuscules : aucun changement
    et pour les headers il est bien dedans :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #include "ai.h"
    #include "collision.h"
    #include "deplacements.h"
    #include "particules.h"
    Je viens de me rendre compte que si je met le prototype dans le fichier main, la fonction ne marche pas (mais là impossible de savoir si c'est la fonction qui est défectueuse ou si elle n'est juste pas appelée ). J'ai essayé de mettre la fonction entière à la fin du programme mais j'obtient une erreur :
    fatal error LNK1169: un ou plusieurs symboles définis à différentes reprises ont été rencontrés
    qui empêche carrément la compilation.

  4. #4
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    On a pas assez d'info, essaye de faire un mini-programme avec juste le fichier/fonction problématique et voit si tu as toujours un problème. Si oui poste le ici, sinon tu peux toujours poster l’entièreté de ton main.c et des autres fichiers problématiques.

    À priori je dirais que c'est à cause de ton fichier AI.c qui n'est pas compilé en .o et pas linké avec le programme principal.

    Aussi, pas la peine de faire des messages ne servant à rien comme les "up", fait ça si t'as pas de réponse dans 3 jours... Ou mieux encore, re-formule ton problème et donne des explications additionnelles car si personne n'a répondu au bout de 3 jours c'est surement parce que ton message est peu complet.

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut
    merci pour la réponse
    je met le code ici en attendant, je vais essayer d'autres choses pour voir d'où viens le problème
    (le code est un peu long, pour ne pas flood j'ai enlevé les parties qui n'influencent pas)
    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
    #include "ai.h"
    #include "collision.h"
    #include "deplacements.h"
    #include "particules.h"
    #define TEMPS_TIR 100
    #define HAUTEUR_ECRAN 700
    #define LARGEUR_ECRAN 1000
     
    void ai (AABB joueur, AABB ecran);
    int main(int argc, char *argv[])
    {
     
    Input in; //variable perso
     
    AABB ecran,
    	zone,
    	joueur,
    	bloc,
    	tirHor,
    	tirVer;
     
    //déclaration des autres variables
     
    //création des surfaces et initialisations des positions avec la SDL
     
     memset(&in,0,sizeof(in));
    while(!in.key[SDLK_ESCAPE])//in.key  ===> tableau in, key[numéro de la touche enfoncée]
    	{
    		SDL_FillRect (ecran.surface, NULL, SDL_MapRGB(ecran.surface->format, 20, 50, 120));
    		SDL_BlitSurface (zone.surface, NULL, ecran.surface, &zone.pos);
    		SDL_BlitSurface (bloc.surface, NULL, ecran.surface, &bloc.pos);
    		SDL_BlitSurface (joueur.surface, NULL, ecran.surface, &joueur.pos);
     
    		ai(joueur, ecran);
    		//déplacements et autres fonctions secondaires
     
    	 SDL_Flip(ecran.surface);
    	}
     SDL_FreeSurface(bloc.surface);
     SDL_FreeSurface(joueur.surface);
     SDL_Quit ();
      return EXIT_SUCCESS;
    }
    Et ici la fonction qui pose problème :
    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
    #include <SDL.h>
     
    typedef struct // variable pour les collisions
    {
    	SDL_Surface *surface;
    	SDL_Rect pos;
    }AABB;
     
    void ai (AABB joueur, AABB ecran)
    {
    	AABB mob;
     
    	mob.surface = SDL_CreateRGBSurface (SDL_HWSURFACE, 20, 20, 32, 0, 0, 0, 0);
    	SDL_FillRect (mob.surface, NULL, SDL_MapRGB(ecran.surface->format, 50, 50, 50));
     
    	mob.pos.x = 400;
    	mob.pos.y = 400;
     
     
    	if (mob.pos.x > joueur.pos.x + joueur.surface->w)
    		mob.pos.x--;
    	if (mob.pos.x + mob.surface->w < joueur.pos.x)
    		mob.pos.x++;
    	if (mob.pos.y > joueur.pos.y + joueur.surface->h)
    		mob.pos.y--;
    	if (mob.pos.y + mob.surface->h < joueur.pos.y)
    		mob.pos.y++;
     
    	SDL_BlitSurface (mob.surface, NULL, ecran.surface, &mob.pos);
    }
    ainsi que son prototype

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <SDL.h>
     
    typedef struct // variable pour les collisions
    {
    	SDL_Surface *surface;
    	SDL_Rect pos;
    }AABB;
     
    void ai (AABB joueur, AABB ecran);
    Encore une fois je met ce code là si quelqu'un veut y jeter un coup d'oeil, je mettrai à jour le post quand j'aurai trouvé quelque chose d'intéressant

    PS : désolé pour le up si tôt, trop l'habitude des autres forums

  6. #6
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Ca ne sert a rien de redeclarer ta fonction ai si tu inclues son prototype avec ai.h...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "ai.h"
    #include "collision.h"
    #include "deplacements.h"
    #include "particules.h"
    #define TEMPS_TIR 100
    #define HAUTEUR_ECRAN 700
    #define LARGEUR_ECRAN 1000
     
    void ai (AABB joueur, AABB ecran);
    int main(int argc, char *argv[])
    {
    ...
    }

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Février 2014
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Février 2014
    Messages : 8
    Points : 5
    Points
    5
    Par défaut petit oubli
    Celui là est un oubli de ma part, je l'ai rajouté pour faire des tests, ça me fait une erreur, mais il ne faut juste pas en tenir compte ^^

  8. #8
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Il se passe quoi si tu rajoutes une fonction dans ai.c (et ai.h du coup) ? La seule solution que je vois a ton probleme est tout simplement que tu as oublie de linker le fichier pour la compilation...

Discussions similaires

  1. besoin d'explication sur le c++
    Par poporiding dans le forum MFC
    Réponses: 13
    Dernier message: 17/12/2005, 18h01
  2. Besoin d'explications sur un bout de code
    Par zizitop dans le forum C
    Réponses: 7
    Dernier message: 26/04/2005, 14h51
  3. [C#] J'aurais besoin d'explication
    Par Roach- dans le forum Windows Forms
    Réponses: 18
    Dernier message: 10/03/2005, 16h00
  4. Besoin d'explications sur float et l'élasticité !
    Par KneXtasY dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 14/01/2005, 15h15
  5. [Foreign Key] Besoin d'explication.
    Par Andry dans le forum Débuter
    Réponses: 4
    Dernier message: 28/05/2003, 11h34

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