Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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