Pages : 1
#1 Le 18/10/2008, à 16:36
- guiguitoutch
Pb langage C et structure
Bonjour, j'ai un petit problème dans mon programme, lors de la compilation avec gcc sous ubuntu, il m'est dit :
joueur.c: Dans la fonction «enregistrement» :
joueur.c:70: erreur: incompatible types in assignment
donc apparemment, j'ai une erreur de type, hors je ne pense pas avoir cette erreur.
Car je tente de mettre une valeur de type char nommée nom dans une structure joueur {char nom, int score}j ;
ainsi, je marque
j.nom = nom;
et c'est à ce niveau la que ca ne compile pas.
Est ce que quelqu'un pourrait m'aider, je vous met ma fonction pour que vous puissiez lire mon code.
Merci d'avance.
//Fonction qui permet l enregistrement d un nouveau joueur dans le fichier profil
//entree : nom choisi par le joueur
//sortie : la structure joueur qui corespondra a ce nom choisi
joueur enregistrement(char nom[20])
{
joueur j;
FILE*fic; //Declaration du fichier
printf("votre surnom est: ");
puts(nom);
printf("Vous allez etre enregistre\n");
printf(". . .\n");
//creation de la structure joueur corespondante
j.nom = nom;
j.score = 0;
//ouverture du fichier en mode ajout
fic=fopen("profil","a");
//test si erreur
if(fic==NULL)
puts("Probleme lors de l'ouverture");
else
{
fwrite(&j,sizeof(joueur),1,fic); //ecriture du nouveau joueur a la suite du fichier
printf("Vous ete enregistré");
fclose(fic); //fermeture du fichier
}
return(j);
}
#2 Le 18/10/2008, à 16:44
- chcamier
Re : Pb langage C et structure
Bonjour,
Si le type joueur est une structure (ce qui est le cas ici), il ne peut être passé par valeur. Le langage C ne le supporte pas. Il faut donc retourner un pointeur.
Donc il faut définir la fonction comme suit :
joueur *enregistrement(char nom[])
Puis définir la variable j comme un pointeur sur joueur puis l'allouer comme suit :
j = (joueur *)malloc(sizeof(joueur)
Ce qui oblige à corriger l'assignation comme suit :
j->nom = nom;
j->score = 0;
CC
Dernière modification par chcamier (Le 18/10/2008, à 17:51)
Hors ligne
#3 Le 18/10/2008, à 17:34
- guiguitoutch
Re : Pb langage C et structure
Merci, mais je ne comprends pas à quoi correspond le [b] ?
J'ai tenté de faire comme tu me l'as dit, mais j'ai toujours des erreurs.
Je pense que je ne doit pas bien utiliser les pointeurs.
Si quelqu'un pouvait me dire exactement ce que je dois marquer, définir etc, je veux bien, car ca fait un bout de temps que j'essaie des choses avec des poniteurs, et je n'ai jamais reussi à en utiliser.
Merci
#4 Le 18/10/2008, à 17:51
- chcamier
Re : Pb langage C et structure
Ce n'est rien, je me suis planté en mettant la réponse en gras. Je corrige de suite.
CC
Coquille corrigée, a plus de [b].
Dernière modification par chcamier (Le 18/10/2008, à 17:52)
Hors ligne
#5 Le 18/10/2008, à 18:05
- guiguitoutch
Re : Pb langage C et structure
Oui, j'ai essayé sans l'erreur, comment est ce que je définit mon pointeur,
Quelles sont les étapes a faire pour bien le définir.
Désolé de toutes ces questions mais j'aimerais un petit tuto pour bien manipuler un pointeur, pour tenter d'y comprendre pour une fois quelque chose.
Merci
#6 Le 18/10/2008, à 18:49
- chcamier
Re : Pb langage C et structure
Un pointeur est une variable scalaire (pouvant être passés en argument ou retournée par une fonction) qui, eu lieu de contenir directement la valeur, contient l'adresse de la valeur.
Un pointeur est défini en mettant une étoile (*) devant son nom dans sa définition. Exemples :
char *pc; // Pointeur sur un caractère
int *pi; // Pointeur sur un entier
struct toto *ps; // Pointeur sur un élément de type struct toto
joueur *j; // pointeur sur un élément de type joueur
Pour en savoir plus, je t'invite à voire les sites suivants :
- http://www.ltam.lu/Tutoriel_Ansi_C/prg-c88.htm (fr)
- http://www.commentcamarche.net/contents/c/cpoint.php3 (fr)
- http://wwwens.uqac.ca/azinflou/pointeurenC.pdf (fr)
CC
Dernière modification par chcamier (Le 18/10/2008, à 18:50)
Hors ligne
#7 Le 20/10/2008, à 12:05
- jofab
Re : Pb langage C et structure
Bonjour,
le probleme n'est pas lié au type joueur mais au type joueur.nom :
en effet tu veux assigner nom qui est de type char[] (un pointeur donc) avec j.nom qui selon ta definition est un simple char (donc un unique caractère...).
Solution :
Soit tu definis dans ta structure joueur {char *nom, int score} ; histoire d'avoir un pointeur et de ce fait tu peux réaliser l'assignation (mais attention ca ne copie pas la chaine, ca te donnera deux pointeurs sur la meme chaine)
Soit tu definis un tableau (allouer dynamiquement ou pas, par exemple {char nom[20], int score}j) et la, tu utilises strcpy pour copier le contenu de la chaine...
Par ailleurs, le fait de renvoyer un joueur et non un pointeur sur un joueur est tout à fait possible en c ! L'avantage c'est que l'on a pas d'allocation dynamique à faire. En revanche c'est bcp moins efficace car le contenu de ta structure est copiée deux fois au retour de la fonction : une fois de ta variable locale vers la pile et une fois de la pile vers la variable qui va recuperer le resultat. Donc a utiliser avec precautions et uniquement pour des petites structures...
Cordialement,
Jo
ps : declare une constante pour la longueur de ta chaine
par exemple :
#define MAX_LONG_NOM 20
joueur enregistrement(char nom[MAX_LONG_NOM])
Hors ligne
Pages : 1