Tchaironne Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 Bon alors voila je viens de commencer la programmation en C il y a 2 jours (j'avais d'ailleurs poster sur ce forum pour avoir un bon IDE gratuit pour commencer ^^) Je suis en train de suivre le tutorial de SdZ. J'en suis arrivé à ce chapitre et je n'arrive pas à créer ma fonction d'initialisation de ma structure. Le problème est que, contrairement à l'auteur, j'ai pris l'exemple d'une liste de contact J'ai essayer ces 2 méthodes mais je n'arrive jamais à initialiser mes tableaux de caractères void initialiserPersonne(Personne *perso) { *perso->nom[] = "Test"; *perso->prenom[] = "Initialisation"; *perso->age = 0; } */ /* void initialiserPersonne(Personne *perso) { Personne joueur = {"Test","Initialisation",0}; *perso = joueur; } */ J'aimerais savoir comment initialiser une chaine de caractere ciblée appartenant à une structure et ciblée par un pointeur. Merci d'avance. Si je peux upload sur un ftp le fichier zip contenant tous les fichiers du projet Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 Il faudrait voir ce que ton compilo te dit et le code complet, ça pourrait t'aider. Effectivement, il y a quelques erreurs. void initialiserPersonne(Personne *perso) { *perso->nom[] = "Test"; *perso->prenom[] = "Initialisation"; *perso->age = 0; } Là ça ne va pas. 1/ Tu ne peux pas affecter une chaîne de caractères à l'aide d'un simple '=', il te faut passer par memcpy ou strncpy. 2/ Ce n'est pas *perso->truc, c'est perso->truc ou *perso.truc. La -> c'est directement déréférencé (* implicite). void initialiserPersonne(Personne *perso) { Personne joueur = {"Test","Initialisation",0}; *perso = joueur; } La non plus ça ne va pas. Déjà je pense que ton joueur ne sera définit que dans le range de la fonction. Ensuite tu ne peux pas assigner une structure avec un simpe '=' non plus. Il faut copier les membres uns par uns. Ou alors passer par pointeur. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 void initialiserPersonne(Personne *perso) { Personne joueur = {"Test","Initialisation",0}; *perso = joueur; } La non plus ça ne va pas. Déjà je pense que ton joueur ne sera définit que dans le range de la fonction. Ensuite tu ne peux pas assigner une structure avec un simpe '=' non plus. Il faut copier les membres uns par uns. Ou alors passer par pointeur. Sisi, on peut, c'est le compilo qui s'occupe de creer le fonction, et qui fait des '=' sur tous les membres. Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 Au temps pour moi. En fait la seconde solution fonctionne très bien. EDIT : Merci de préciser le langage dans le titre du topic. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 Au temps pour moi. En fait la seconde solution fonctionne très bien. EDIT : Merci de préciser le langage dans le titre du topic. D'ailleurs, on pourrait meme chipotter que, meme sa premiere fonction initialiserPersonne est "correct" void initialiserPersonne(Personne *perso) { perso->nom = "Test"; perso->prenom = "Initialisation"; perso->age = 0; } "Test" et "Initialisation" étant des chaines créé statiquement par le compilo, perso->nom et perso->prenom pointeront correctement (vers une zone memoire allouée) :) Son principal problème est plus du côté de l'écriture autour des pointeurs, et des chaines (*., ->, etc) Lien vers le commentaire Partager sur d’autres sites More sharing options...
theocrite Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 Nope, là ça ne fonctionne pas : test.c: In function `initialiserPersonne': test.c:12: error: incompatible types in assignment test.c:13: error: incompatible types in assignment Ça fonctionne avec un strncpy. Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 ça dépend des compilo, sans doute, certains doivent accepter qu'un char* pointe vers un const char* mais sinon, je suis d'accord avec theo, ça n'a pas beaucoup de sens. D'autant plus que lorsque tu veux modifier l'un de ces champs, tu va faire un fonction de ce type là : set_name(Personne *perso, char * name) { if(perso != NULL) { if(perso->nom != NULL) free(perso->nom); perso->nom = name; } } avec un joli free() pour éviter la fuite de mémoire. Et là, je pense que le free sur le const char * non NULL (puisqu'en zone .data) il va pas être content (et sans avertissement du compilo, en plus) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Spaz001 Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 ça dépend des compilo, sans doute, certains doivent accepter qu'un char* pointe vers un const char* Certains compilo font le transtypage tout seul, oui mais sinon, je suis d'accord avec theo, ça n'a pas beaucoup de sens. Je suis d'accord, je suis d'accord (que ca n'a pas de sens), mais il n'y a pas forcément besoin d'un sens pour que ce soit "corect", encore plus quand c'est pour apprendre :) avec un joli free() pour éviter la fuite de mémoire. Et là, je pense que le free sur le const char * non NULL (puisqu'en zone .data) il va pas être content (et sans avertissement du compilo, en plus) C'est ca la découverte Lien vers le commentaire Partager sur d’autres sites More sharing options...
tuXXX Posté(e) le 17 novembre 2006 Partager Posté(e) le 17 novembre 2006 void initialiserPersonne(Personne *perso) { Personne joueur = {"Test","Initialisation",0}; *perso = joueur; } La non plus ça ne va pas. Sisi, on peut, c'est le compilo qui s'occupe de creer le fonction, et qui fait des '=' sur tous les membres. Au temps pour moi. D'ailleurs il y a une 3ème façon d'initialiser des structures : struct test { int a; int b; int c; }; int main() { struct test a = { .c = 5, .b = 6 }; printf("%i %i %i\n", a.a, a.b, a.c); return 0; } 0 6 5 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Soulfly_tribe90 Posté(e) le 19 novembre 2006 Partager Posté(e) le 19 novembre 2006 En général je fais comme ca pour manipuler des structures : typedef struct SPersonne{ char* nom; char* prenom; char* adresse; long age; int garcon; // Booléen : 1 = garçon, 0 = fille }SPersonnes,*Personnes; Personnes init(){ Personnes p = (Personnes)malloc(sizeof(SPersonnes)); p->nom = "Awards"; p->prenom = "Jean Luc"; p->adresse = "23 rue des Oliviers"; p->age = 22; p->garcon = 1; return p; } Lien vers le commentaire Partager sur d’autres sites More sharing options...
lorinc Posté(e) le 20 novembre 2006 Partager Posté(e) le 20 novembre 2006 mhmm, perso je ne suis pas fan du tout du masquage de pointeur par ce genre d'astuces. Ça me fait toujours bizarre de faire un Personne p = initPersonne(); sachant que c'est un pointeur que je veux... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Soulfly_tribe90 Posté(e) le 20 novembre 2006 Partager Posté(e) le 20 novembre 2006 mhmm, perso je ne suis pas fan du tout du masquage de pointeur par ce genre d'astuces. Ça me fait toujours bizarre de faire un Personne p = initPersonne(); sachant que c'est un pointeur que je veux... Ca fait toujours bizarre la premiere fois lol Non mais c'est vrai que pour débuter et comprendre les pointeurs c'est pas une solution très interessante et meme apres c'est sur qu'il faut bien suivre et comprendre le programme pour savoir qu'il y a un pointeur caché la dessous Mais je trouve ca pratique dans l'ensemble !!! Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés
Archivé
Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.