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 :

"Undefined reference to [ma fonction]"


Sujet :

C

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 37
    Points
    37
    Par défaut "Undefined reference to [ma fonction]"
    Bonjour à tous!
    Je suis nouvelle sur ce forum et j'ai besoin d'aide concernant un de mes programmes.
    Pour résumer je suis le tutoriel de Mateo21 pour apprendre à programmer en C. Jusque là tout se passe bien mais j'ai programmé le Mario Sokoban (dans la partie 3 sur la SDL) mais code::block ne reconnaît pas une fonction que j'ai faite "jouer(SDL_Surface* ecran)". En fait dans mon main.c je l'utilise "jouer(ecran)" avec la surface ecran qui est bien déclarée au début du programme (SDL_Surface *ecran = NULL et la surface que j'ai bien réussi à charger à l'aide de SDL_SetVideoMode.
    Pour éviter de trop charger mon main j'ai fait la fonction dans le fichier "jeu.c" avec le header "jeu.h" qui est bien inclu dans mon main etc. J'ai le même problème pour ma fonction "editeur(ecran)" mais ça doit être exactement le même problème.
    Je vous mets le code de mon main.c, de ma fonction "jouer" et du header jeu.h

    main.c:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL_image.h>
     
    #include "constantes.h"
    #include "jeu.h"
    #include "editeur.h"
    #include "fichiers.h"
     
    int main(int argc, char* argv[])
    {
        SDL_Surface *ecran = NULL, *menu = NULL;
        SDL_Rect positionMenu;
        SDL_Event event;
     
        int continuer = 1;
     
        if(SDL_Init(SDL_INIT_VIDEO) == -1)
        {
            fprintf(stderr, "Impossible de charger la SDL: %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
     
        SDL_WM_SetIcon(IMG_Load("caisse.jpg"), NULL);
     
        ecran = SDL_SetVideoMode(LARGEUR_FENETRE, HAUTEUR_FENETRE, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
        if(ecran == NULL)
        {
            fprintf(stderr, "Impossible de charger le mode video: %s\n", SDL_GetError());
            exit(EXIT_FAILURE);
        }
        SDL_WM_SetCaption("Mario SOkoban", NULL);
     
        menu = IMG_Load("menu.jpg");
        positionMenu.x = 0;
        positionMenu.y = 0;
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
                    break;
                case SDL_KEYDOWN:
                    switch(event.key.keysym.sym)
                    {
                        case SDLK_ESCAPE:
                            continuer = 0;
                            break;
                        case SDLK_KP1:
                            jouer(ecran);
                            break;
                        case SDLK_KP2:
                            editeur(ecran);
                            break;
                    }
                    break;
            }
        // Effacement de l'écran
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 0, 0, 0));
        SDL_BlitSurface(menu, NULL, ecran, &positionMenu);
        SDL_Flip(ecran);
        }
        SDL_FreeSurface(menu);
        SDL_Quit();
     
        return EXIT_SUCCESS;
    }
    jeu.h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    void jouer(SDL_Surface* ecran);
    void deplacerJoueur(int carte[] [NB_BLOCS_HAUTEUR], SDL_Rect *pos, int direction);
    void deplacerCaisse(int *premiereCase, int *secondeCase);
    code de jouer(ecran):
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
     
    jouer(SDL_Surface* ecran)
    {
        SDL_Surface *mario[4] = {NULL};
        SDL_Surface *mur = NULL, *caisse = NULL, *caisseOK = NULL, *objectif = NULL, *marioActuel = NULL;
        SDL_Rect position, positionJoueur;
        SDL_Event event;
     
        int continuer = 1, objectifsRestants = 0, i = 0, j = 0;
        int carte[NB_BLOCS_LARGEUR][NB_BLOCS_HAUTEUR] = {0};
     
        mur = IMG_Load("mur.jpg");
        caisse = IMG_Load("caisse.jpg");
        caisseOK = IMG_Load("caisse_ok.jpg");
        objectif = IMG_Load("objectif.png");
        mario[BAS] = IMG_Load("mario_bas.gif");
        mario[GAUCHE] = IMG_Load("mario_gauche.gif");
        mario[DROITE] = IMG_Load("mario_droite.gif"),
        mario[HAUT] = IMG_Load("mario_haut.gif");
     
        marioActuel = mario[BAS]; //Mario sera dirigé vers le bas au départ//
     
        //Chargement du niveau
        if (!chargerNiveau(carte))
            exit(EXIT_FAILURE);
     
        //Recherche de la position de Mario au départ
        for(i = 0; i <NB_BLOCS_LARGEUR; i++)
        {
            for (j = 0; j <NB_BLOCS_HAUTEUR; j++)
            {
                if(carte[i][j] == MARIO) //Si Mario se trouve à cette position
                {
                    positionJoueur.x = i;
                    positionJoueur.y = j;
                    carte[i][j] = VIDE;
                }
            }
        }
     
        //Activation de la répétition des touches
        SDL_EnableKeyRepeat(100,100);
     
        //Boucle principale
        while(continuer)
        {
            switch(event.type)
            {
            case SDL_QUIT:
                continuer = 0;
                break;
            case SDL_KEYDOWN:
                switch(event.key.keysym.sym)
                {
                case SDLK_ESCAPE:
                    continuer = 0;
                    break;
                case SDLK_UP:
                    marioActuel = mario[HAUT];
                    deplacerJoueur(carte, &positionJoueur, HAUT);
                    break;
                case SDLK_DOWN:
                    marioActuel = mario[BAS];
                    deplacerJoueur(carte, &positionJoueur, HAUT);
                    break;
                case SDLK_RIGHT:
                    marioActuel = mario[DROITE];
                    deplacerJoueur(carte, &positionJoueur, DROITE);
                    break;
                case SDLK_LEFT:
                    marioActuel = mario[GAUCHE];
                    deplacerJoueur(carte, &positionJoueur, GAUCHE);
                    break;
                }
     
                break;
            }
            //Effacement de l'écran
                SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
                // Placement des objets à l'écran
                objectifsRestants = 0;
     
                for(i = 0; i < NB_BLOCS_LARGEUR; i++)
                {
                    for(j = 0; j < NB_BLOCS_HAUTEUR; j++)
                    {
                        position.x = i * TAILLE_BLOC;
                        position.y = j * TAILLE_BLOC;
     
                        switch(carte[i][j])
                        {
                        case MUR:
                            SDL_BlitSurface(mur, NULL, ecran, &position);
                            break;
                        case CAISSE:
                            SDL_BlitSurface(caisse, NULL, ecran, &position);
                            break;
                        case CAISSE_OK:
                            SDL_BlitSurface(caisseOK, NULL, ecran, &position);
                            break;
                        case OBJECTIF:
                            SDL_BlitSurface(objectif, NULL, ecran, &position);
                            objectifsRestants = 1;
                            break;
                        }
                    }
                }
                //Si on n'a trouvé aucun objectif sur la carte c'est qu'on a gagné
                if(!objectifsRestants)
                    continuer = 0;
     
                //On place le joueur à la bonne position
                position.x = positionJoueur.x * TAILLE_BLOC;
                position.y = positionJoueur.y * TAILLE_BLOC;
                SDL_BlitSurface(marioActuel, NULL, ecran, &position);
     
                SDL_Flip(ecran);
        }
        //Désactivation de la répétition des touches (remises à 0)
        SDL_EnableKeyRepeat(0,0);
     
        //Libération des surfaces chargées
        SDL_FreeSurface(mur);
        SDL_FreeSurface(caisse);
        SDL_FreeSurface(caisseOK);
        SDL_FreeSurface(objectif);
        for(i = 0; i < 4; i++)
            SDL_FreeSurface(mario[i]);
    }
    Désolée pour le pavé ^^'

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    As-tu bien ajouté le fichier jeu.c au projet afin d'informer l'IDE qu'il doit l'inclure à la phase de compilation ? Peux-tu nous montrer le journal de compilation et le message d'erreur exact de l'éditeur de liens ?

  3. #3
    Membre expérimenté Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Points : 1 372
    Points
    1 372
    Par défaut
    Les "Undefined reference to [ma fonction]" sont normalement dus à l'absence de la fonction lors de l'édition de lien (après la compilation), soit en raison de l'absence d'une bibliothèque (ou library en anglais), soit du fait de l'absence du code compilé de la fonction si c'est toi qui l'a codée.
    C'est pourquoi Matt_Houston te demande si tu as bien ajouté le code de ta fonction (a priori dans jeu.c) à ton projet ...
    Dans Code::Blocks, tu fais un clic droit sur le projet et tu choisis Add Files, puis tu sélectionnes le fichier jeu.c et tu valides, ce qui va t'ouvrir une fenêtre et te demander à quelles cibles tu rattaches ton fichier, par défaut Debug et Release que tu coches et tu valides encore et hop, là tu peux compiler.
    Si le fichier jeu.c est déjà dans ton projet alors tu peux faire un clic droit et dans le menu contextuel tu choisis Properties et tu vérifies que cela ressemble à ça :

    Nom : Capture d'écran de 2016-06-18 18:35:50.png
Affichages : 3071
Taille : 32,4 Ko

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 37
    Points
    37
    Par défaut
    Non non tout ça a été fait mais il continue de m'afficher ça:
    Nom : problème sokoban.PNG
Affichages : 2923
Taille : 9,1 Ko
    même si j'avais déjà fait ce que vous me conseilliez:
    Nom : jeu.PNG
Affichages : 3003
Taille : 7,5 Ko

  5. #5
    Expert éminent sénior
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 214
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 214
    Points : 10 140
    Points
    10 140
    Par défaut
    L'erreur est explicite , il ne reconnaît pas les fonctions jouer et editeur.
    Tu es sur que tu as mis ces fonction dans main.cpp (ou rajouter le .c correspondant ?) ,.
    D'ailleurs pourquoi cpp ? tu le code en C non , le C et le C++ sont deux langage différents.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 37
    Points
    37
    Par défaut
    J'ai mis mes fonctions dans un .c correspondant auquel j'ai inclu le .h dans le main.cpp.
    Je ne sais pas pourquoi c'est main.cpp mais ce que je sais c'est que je code bien en C. Je souhaite pas trop m'avancer (je suis encore nouvelle en programmation) mais je pense que c'est la SDL qui fait que le main soit en .cpp. Comme preuve j'ai mes autres projets SDL dont le main est bien en cpp mais tout fonctionne normalement alors que c'est bien écrit en C (de toutes façons je ne connais pas le C++)

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Mais là, tu vas te heurter aux problèmes de Name Mangling.
    Regarde si tu ne peux pas renommer main de .cpp à .c sans faire foirer la compilation.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2016
    Messages
    16
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Lycéen
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2016
    Messages : 16
    Points : 37
    Points
    37
    Par défaut
    Merci ça fonctionne maintenant (même si mon programme ne fonctionne toujours pas au moins les fonctions sont chargées et c'est plus des erreurs de programmation "classiques")

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

Discussions similaires

  1. undefined reference to 'fonction()' avec code block
    Par Marmoccelle dans le forum Code::Blocks
    Réponses: 8
    Dernier message: 01/02/2019, 16h15
  2. Fonction undefined reference
    Par black_hole dans le forum C
    Réponses: 11
    Dernier message: 02/04/2013, 09h59
  3. Undefined reference avec les fonctions d'une class
    Par romnair dans le forum Débuter
    Réponses: 5
    Dernier message: 10/04/2012, 16h40
  4. Fonctions membres static - undefined reference
    Par OliveK dans le forum C++/CLI
    Réponses: 3
    Dernier message: 09/10/2010, 00h40
  5. Fonctions membres static - undefined reference
    Par OliveK dans le forum C++
    Réponses: 1
    Dernier message: 18/08/2010, 23h26

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