Aller au contenu

[c] Initialiser une structure


Tchaironne

Messages recommandés

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 :yes:

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

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

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. :iloveyou:

Lien vers le commentaire
Partager sur d’autres sites

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" :iloveyou:

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) :craint:

Lien vers le commentaire
Partager sur d’autres sites

ç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) :transpi:

Lien vers le commentaire
Partager sur d’autres sites

ç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 :transpi:

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

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. :ouioui:
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

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

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 :non:

Mais je trouve ca pratique dans l'ensemble !!!

Lien vers le commentaire
Partager sur d’autres sites

Archivé

Ce sujet est désormais archivé et ne peut plus recevoir de nouvelles réponses.

×
×
  • Créer...