Undefined reference: C

Résolu/Fermé
Wazza56 Messages postés 379 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 31 mars 2014 - Modifié par Wazza56 le 24/03/2010 à 14:54
Wazza56 Messages postés 379 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 31 mars 2014 - 31 mars 2010 à 17:18
Bonjours à tous,
j'ai un gros problème avec mon code C et je suis débutant, j'ai énormément de mal à résoudre ce problème alors si vous pouvez m'aider ça serait sympa ;)

J'ai des undefined reference pour nbMystere et MAX

Voila mon code:

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

extern int nbMystere; /*declaration des variables globales*/ 
extern int nombreChoisi; 
extern int MAX; 
extern char rejouer; 
extern int nombreChoisi; 

int menu() //Fonction menu qui permet de choisir le mode de jeu 
{ 
    int partie = 1; 
    printf("Welcome dans mon pg qui rox pas du tout du poney!!!\n"); 
    printf("choisissez une partie\n"); 
    printf("1- 1 joueur\n"); 
    printf("2- 2joueurs\n"); 
    scanf("%d", &partie); 
return partie; //permet de retourner la valeur choisi 
} 

int nbAleatoire() //Fonction qui genere un nombre aleatoire 
{ 
    const int MIN = 1; 
    const int MAX = 100; 
    srand(time(NULL)); 
    nbMystere = (rand() % (MAX - MIN +1)) + MIN; 
return nbMystere; //Permet de retourner le nombre mystere 
} 

void nombreChoi() //Fonction qui demande a l'utilisateur de choisir un nombre 
{ 
            do 
            { 
                printf("Quel est le nombre?\t "); 
                scanf("%d", &nombreChoisi); 
                compareNombre(nombreChoisi); //Appel de la fonction compareNombre avec en parametre nombreChoisi 
            } while ( nombreChoisi != nbMystere);//Faire tan que le nombre choisi est different du nombre mystere 
} 

int compareNombre(int nombreChoisi) //Fonction qui compare le nombe choisi au nombre mystere 
                                    //Cette fonction est appelee dans la fonction nombreChoi() 
{ 
//Controles de saisie 
    if (nombreChoisi > MAX) 
            printf("Le nombre saisit doit etre inferieur a 100\n"); 

    else if (nombreChoisi < 0) 
            printf("Le nombre choit doit etre superieur a 0\n"); 

//On compare le nombre et on donne le resultat 
    else 
            if (nombreChoisi < nbMystere) 
                printf("C'est plus!\n"); 
            else if (nombreChoisi > nbMystere) 
                printf("C'est moins!\n"); 
            else 
                printf("Bravo tu as trouve le bon nombre!\n\n"); 
} 

int verifMax(int MAX) //Fonction qui verifie si le nombre MAX est bien supperieur au nombre mystere 
{ 
    if (MAX < nbMystere) 
        printf("Impossible veillez entrer un nombre max superieur au nombre mystere!\n"); 
    else 
        printf("Le nombre max est correct, appuyer sur n'importe quelle touche pour continuer\n"); 
} 

int main() 
{ 

switch(menu())//switch permet de faire une selection a partir de la reponse que va retourner la fonction menu() 
             //et se placer sur le case correspondant 
{ 
    case 1: //Execute le code a partir d'ici si la fonction menu() renvoi 1 
    printf("Mode 1 joueur!\n"); 
    nbMystere = nbAleatoire(nbMystere); 
    nombreChoi(); 
    break; 

    case 2://Execute le code a partir d'ici si la fonction menu() renvoi 2 
            printf("Mode 2 joueurs!\n"); 

            printf("Joueur 1 veillez entrez le nombre mystere!\t"); 
            scanf("%d", &nbMystere); 
            printf("\n"); 
            printf("Joueur 1 veillez indiquer le nombre maximum (il doit etre superieur au nombre mystere)\t"); 
            scanf("%d", &MAX); 
            verifMax(MAX); 
            system("cls"); 

            printf("Le nombre mystere se trouve entre 1 et %d\n", MAX); 
            printf("Bonne chance joueur 2!\n"); 

        nombreChoi(); 
    break; 
} 

   printf("APPUIE SUR UNE TOUCHE POUR CONTINUER!"); 
   system("pause > 0"); 
} 


Merci à vous de prendre le temps de m'aider :)

6 réponses

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 mars 2010 à 22:47
Tu n'as pas très bien compris. Mais ça va venir ;-))).
Cela se passe en deux temps.
Tu déclares ta variable dans un fichier source (.c) normalement mais en dehors de tout bloc.
Ensuite, tu déclares ta variable en extern dans un fichier header (.h). C'est ce fichier-là qu'il faudra inclure dans tous les fichiers où tu souhaites utiliser ta variable.
Exemple :
toto.c
int a=5;
-----
toto.h
extern a;
---
fichier.c
#include "toto.h"
/*tu peux dorénavant utiliser la variable a*/

Mais, je me répète, tu n'as pas besoin d'utiliser extern si tu n'as qu'un seul fichier. Et tu n'as même pas besoin d'utiliser des variables globales dans ton cas, il te suffit de les passer en paramètre. En règle générale, il vaut mieux éviter l'utilisation de variables globales.
1
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
24 mars 2010 à 15:28
Salut.
Si tu n'as que ce fichier là, c'est normal.
tu déclares tes variables mais tu ne les définis pas. C'est comme avec les fonctions, il faut qu'elles soit définis une unique fois, mais déclarer autant qu'on veux.
le extern annonce que tu as une vairable (ou une fonction) mais que celle-ci est définie ailleurs.
Pour moi, le souci viens du fait que extern est obligatoire pour les variables mais pas pour les fonctions.
0
Wazza56 Messages postés 379 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 31 mars 2014 27
24 mars 2010 à 22:14
Soit j'ai pas tout compris, soit j'ai compris de travers...
Tu veux dire que mon externe fait référence à une variable contenue dans un autre fichier que je doit mettre en #include c'est ça?
Si c'est ça je ne sais pas comment faire ^^
Sinon, comment puis-je déclarer une variable globale autrement?
Merci pour ta réponse!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 mars 2010 à 08:09
bon, tu n'as pas tout compris.
Il faut que tu mettes ta variable globale dans un autre fichier, mais pas un include (les include n'ont en fait rien de mystérieux, ce sont de simples copier coller).
En général, on met :
extern TYPE variable;
dans un fichier .h que l'on inclura partout où l'on veux utiliser la variable. Et on met
TYPE variable=VAL;
dans un fichier .c qu'on liera avec le programme. Note le "=VAL" n'est pas obligatoire, mais c'est mieux.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835
25 mars 2010 à 08:34
Je rajouterai que si tu ne précises pas à la définition de la variable sa valeur (TYPE variable = VAL) alors la variable sera initialisée à 0.

De plus, les variables globales sont à éviter autant que possible.
Tu peux tout simplement faire passer les variables en paramètre et les déclarer dans une fonction.
Ensuite, si tu n'utilises pas ces variables dans d'autre fichier, tu n'as pas besoin de passer par extern. Tu peux tout simplement enlever le extern. Ainsi tu n'auras pas besoin de passer par un fichier .h.

Cdlt,
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 mars 2010 à 11:48
Je rajouterai que si tu ne précises pas à la définition de la variable sa valeur (TYPE variable = VAL) alors la variable sera initialisée à 0.
J'aimerai un peu plus de précision là dessus. C'est ce que dit la théorie, mais j'ai remarqué (au moins en C++, ce qui peut expliquer le problème) que ce n'était pas toujours le cas, que des fois la variable prenait une valeur indéterminée.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 835 > Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023
25 mars 2010 à 14:17
Cela dépend de la variable. Sil s'agit dune variable statique ou globale elle sera initialisée a 0 ou son équivalent. Pour les variables sans persistance et locale, elles ne seront pas initialisées.
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
25 mars 2010 à 14:22
Super merci, j'aurai au moins appris un truc aujourd'hui !
0
Wazza56 Messages postés 379 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 31 mars 2014 27
25 mars 2010 à 17:35
Je pencherais plus sur le fait qu'il prend une valeur indéterminé en fonction de son enregistrement en mémoire mais c'est toujours bon à savoir quand on se trompe ^^
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Wazza56 Messages postés 379 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 31 mars 2014 27
25 mars 2010 à 18:08
Bon d'accord je crois que j'ai saisis l'essentiel,cad qu'il faut que je mette ma variable dans un fichier externe en .h
et je lui attribue une valeur dans un autre fichier en .c puis vais lier ces deux fichiers.
Mais comment fait-on pour les lier?
Et si ma variable ne prend de valeur que dans mon programme suis-je obligé de faire un .c?
Désolé si j'ai mal compris et merci de m'aider :)
0
Wazza56 Messages postés 379 Date d'inscription dimanche 23 septembre 2007 Statut Membre Dernière intervention 31 mars 2014 27
31 mars 2010 à 17:18
Merci merci merci beaucoup les gars :)
Désolé de répondre si tard mais je n'est pas vraiment eu le temps récemment de passer et de tester.
Mais cela fonctionne maintenant.
Bon certes j'ai encore quelques petits trucks à revoir parce qu'il y a des bug mais plus d'erreurs!!!
Merci beaucoup.
++
:)
0