Le fameux erreur "undefined reference to 'fonction' . "

[Résolu/Fermé]
Signaler
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
-
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
-
salut !
voila mon problème , j'ai eu l'erreur ' undefined reference to ' malgré que j'ait cernais tout les probs , dans mon projet j'ai deux fichiers source (main.c et exo_joueurs.c ) et j'ai aussi le fichier header (exo_joueurs.h),bref mon code lis les informations des joueurs c tt
donc voila le code :

dans le fichier main.c il y'a :
-----------------------------

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include "exo_joueurs.h"
typedef struct joueur joueur;
struct joueur{
char nom[50];
char prenom[50];
int age;
int sexe;
};

main(){
char S[20];
joueur J[20] = {"","",0,0};
int i;
puts("Bien venu a notre programme qui colécte les informations des joueurs");
rempl_de_tab(&J);
puts("");
puts("");
}

----------------------------------
dans le fichier exo_joueurs.c il y'a :
------------------------------------
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include "exo_joueurs.h"
 
void rempl_de_tab(int *i,joueur *J){
for(*i=0;*i<=19;*i++){
 printf("joueur %d faitez entrez vautre : \n nom \n prenom \n age \n sexe : 1-si homme 2- si famme \n",i);
 scanf("%s%s%d%d",J[*i].nom,J[*i].prenom,J[*i].age,J[*i].sexe);
}
}

------------------------------------
dans le fichier header exo_joueurs.h y'a :
------------------------------------
#ifndef DEF_EXO_JOUEURS
// Si la constante n'a pas été définie le fichier n'a jamais été inclus
#define DEF_EXO_JOUEURS
// On définit la constante pour que la prochaine fois le fichier ne soit plus inclus

/* Contenu de votre fichier .h (autres include, prototypes, define...) */
 void rempl_de_tab();
 void affich_de_tab();

#endif

----------------------------------
voila une photo :

2 réponses

Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
dsl pr l'image
Messages postés
609
Date d'inscription
vendredi 31 juillet 2009
Statut
Membre
Dernière intervention
24 juin 2016
44
Bonjour
@IntGrapher :C ce que je me disait quand j'ai commencé à utiliser les pointeur mais i est de type Int*, et un pointeur est une variable qui stocke une adresse mémoire donc quand il fait *i, il manipule l'adresse d'une adresse(adresse d'un pointeur ou double pointeur)

heu ....
 
/***
* variable pointeur sur un type int 
* communément appelé pointeur de type int
***/
int *i = NULL; 


Pour comprendre les pointeurs en langage C, il faut comprendre comment on utilise la mémoire vive de l'ordinateur.
Lorsque tu crée une variable pour ton programme, un emplacement mémoire de la bonne taille est réserver et cela ce fait dans la mémoire vive (pour mieux comprendre, la mémoire vive est représenté sous la forme d'un tableau de n cases et chaque case a une adresse de 1 à n.
donc au lieu d'utiliser directement les adresses, on utilise des pointeur qui par ça définition,
un pointeur par sont nom propre variable pointeur de type définie , est une variable qui stocke non pas une valeur mais l'adresse d'une autre variable.

à bientôt
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
salut

voila j'ai regrouper le tous sur un seul fichier le main.c et sa a marcher mais se que je veux savoir c'est que dieu pourquoi sa ne marche pas qu'en je fait mon code sur plusieurs fichiers ??
voila le code
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

typedef struct joueur joueur;
struct joueur{
char nom[50];
char prenom[50];
int age;
int sexe;
};

int rempl_de_tab(joueur J[],int taille){

int i ;
for(i=0;i<taille;i++){
 printf("joueur %d faitez entrez vautre : \n nom \n prenom \n age \n sexe : 1-si homme 2- si famme \n",i);
 scanf("%s%s%d%d",&J[i].nom,&J[i].prenom,&J[i].age,&J[i].sexe);
}return 0;
}

int main(void){


joueur J[3];
puts("Bien venu a notre programme qui collecte les informations des joueurs");

rempl_de_tab( J,sizeof(J)/sizeof(*J) );

puts("");
puts("");

return 0;
}
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
youpiiiiiiiiiiiiiii g trouver la solution c bon.... :

il vous faudra remplacer votre main.cpp par un main.c. Pour cela, rien de plus simple, il vous suffit de rajouter un nouveau fichier main.c à votre projet, d'y coller le contenu de votre fichier main.cpp et de supprimer ce dernier en faisant Clic droit -> "Remove file from project".
Messages postés
1
Date d'inscription
jeudi 29 janvier 2015
Statut
Membre
Dernière intervention
29 janvier 2015
>
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016

Grand Merci ;)
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
y'a pas de quoi mon ami Aeghassan
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 784
Bonjour,

Pourquoi passer par un pointeur sur i dans ta fonction rempl_de_tab() ?
Pas besoin. Un simple passage par copie fera l'affaire.

Dans ton .h, le prototype est faux.
Il faut mettre : void rempl_de_tab(int*, joueur*);
D'ailleurs quand tu appelles ta fonction, tu ne passes qu'un paramètre au lieu des 2 attendus. Il faut faire attention à tout bien mettre en conformité.
Dans ta fonction rempl_de_tab(), tu fais printf("%d"...",i); au lieu de *i (vu que c'est un pointeur...).

Et enfin, le prototype de main() est : int main(void). et il ne faut pas oublier le return 0; final. Tu peux aussi enlever le i du main, tu ne t'en sers pas. Je te conseille de simplement l'utiliser dans rempl_de_tab(). Donc tu fais int i; dans rempl_de_tab(). Du coup le prototype devient : void rempl_de_tab(joueur*). Ca sera plus simple et plus propre.

L'erreur peut aussi venir de la compilation. L'édition des liens est-elle correcte ? Comment compiles-tu ?

Google is your friend

salut
merci tout le monde
bon fiddy j'ai bien été aider par ta repense , bon pour t questions (L'édition des liens est-elle correcte ? Comment compiles-tu ? ) je veux bien savoir de quoi tu parle !? si tu parle du compilateur je travaille avec mingw et mon IDE c code;;blocs si non reformule moi ta question pour que j puisse comprendre s.v.p ... , et aussi pourquoi tu veux que je transforme ma procédure void main en fonction int main quelle est le but de ça ?? par-se-que y'a rien a retourner .
Messages postés
11066
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 784
Sans trop rentrer dans les détails, l'édition des liens (ou linking) est l'étape de la compilation où le compilateur fait le lien avec toutes les fonctions, bibliothèques, etc. Si, la compilation est mal faite, (par exemple : oublie d'inclure les bibliothèques lors de l'édition), tu obtiendras un message d'erreur similaire. Pour l'instant, mettons ça de côté. Je ne pense pas que le problème vient de là dans ton cas.
Pour le main(), il n'y a pas de "pourquoi" à se poser. C'est la norme qui dit que cette fonction renvoie un int. La valeur est renvoyée à l'appelant (par exemple l'OS). Il faut renvoyer 0 pour dire que tout s'est bien passer et EXIT_FAILURE en cas d'erreur. D'ailleurs pour être plus précis, le bon prototype du main() sans argument est : int main(void)
N'hésite pas à reposter ton code, si les erreurs persistent après les diverses corrections apportées.
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
ok Mercie beaucoup je te repend dé que je fais les corrections...
Messages postés
30
Date d'inscription
mardi 22 juillet 2014
Statut
Membre
Dernière intervention
17 mars 2016
1
salut fiddy j'ais tous fais comme ta dit mais le truc ne marche pas , méme erreur , j'ai vu sur net que les tableau font directement le passage pare adresse c'est a dire la fonction ne fait pas de copie sauf qu'elle accède directement aux tableau..............donc s que je veux savoire c que esque je peux me débarrasser du pointeur si non comment faire ??