Problème initialisation sur structure

Résolu
Beubeute -  
 Beubeute -
Salut tout le monde,

Je commence une formation sur le C, cependant j'arrive à un problème assez embêtant.
J'essaie d'initialiser un tableau de struct dans une fonction à part, mais j'ai quelques soucis avec les chaînes de caractères.

Voilà en gros les points importants :

struct User {
char name[100];
...
int age;
};

et la fonction d'initialisation

void initUser(User **user, int nb) {
int i;
for(i=0; i<nb; i++) {
user[i]->name = "";
...
user[i]->age = 0;
}
}

Pour l'age il n'y a pas de problème mais pour le nom j'ai vraisemblablement un problème de type que je n'arrive pas à résoudre, j'ai essayé en utilisant la notation (*user[i]).name mais ça ne m'as pas avancé pour autant.

Je pensais qu'on pouvait faire les initialisation sans trop de contrainte, me serais-je trompé ?

Merci d'avance d'éclairer ma lanterne :)

5 réponses

fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut
Il faut utiliser la fonction strcpy ().
Exemple : strcpy (chaine,"");
0
Beubeute
 
Merci de ton aide ça fonctionne, j'étais pourtant persuadé qu'on pouvait faire l'initialisation directement avec le = et utiliser le strcpy pour remplacer plus tard.

Bref j'ai maintenant le compilateur m'affiche un autre problème de type que je n'arrive pas à résoudre.

J'ai seulement modifié la fonction avec le strcpy pour les chaînes et l'appel se fait de cette façon :

User usr[2];
initUser(&user,2);

Voilà ce que me dit le compilo :
note: expected 'struct User **' but argument is of type 'struct User (*)[2]'|

Pourtant l'appel me semble correct puisque j'envoie effectivement un pointeur de structure.

Merci d'avance :)
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
j'étais pourtant persuadé qu'on pouvait faire l'initialisation directement avec le = et utiliser le strcpy pour remplacer plus tard.
Oui c'est possible mais uniquement lors de la déclaration de la variable.
user[i]->name = ""; n'est qu'une affectation.
Par contre, tu pourrais faire struct User user={"", ..., 0};

Ou sinon, user[i]->name[0]='\0'; dans ta fonction initUser().

void initUser(User **user, int nb) {
Pourquoi passer par un double pointeur ? Ca serait plus simple d'utiliser un pointeur simple. De plus, tu ne peux pas faire User** user, il faut préciser le nombre de colonne. Par exemple initUser(User (*user)[2], ...) ou initUser(User user[][2], ...)

Cdlt,
0
Beubeute
 
Salut,

à l'origine j'avais écris quelque chose de semblable (*user)[] mais sans préciser le nombre de colonne, ensuite j'avais essayé diverses choses et je m'étais arrêté sur un double pointeur car ça revenait quasiment au même.

Du coup ça me pose un petit peu problème de devoir forcément envoyer le nombre de colonnes, étant donné que je l'envoie également en paramètre.

Il n'y a pas de moyen pour rendre ce genre de fonction "viable" pour n'importe quel nombre d'utilisateurs ? J'ai essayé de faire quelque chose de dynamique avec des malloc mais je n'ai pas réussi à faire mieux :(
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Ton compilateur doit connaître le nombre de colonnes impérativement si tu lui envoies une matrice. Sinon il ne saura pas quand on arrive à la fin d'une ligne et qu'on doit passer à la ligne suivante.

Il n'y a pas de moyen pour rendre ce genre de fonction "viable" pour n'importe quel nombre d'utilisateurs ?
Je remets ce que j'ai dit dans mon post précédent : Pourquoi passer par un double pointeur ? Ca serait plus simple d'utiliser un pointeur simple.
Ainsi pas besoin de préciser la taille ;-)
0
Beubeute
 
Justement si, on doit donner le nombre de colonnes (en gros le nombre d'utilisateurs). Si je souhaite initialiser 3 utilisateurs il faut que je modifie ma fonction pour donner 3 colonnes et c'est ce qui me gêne.

En gros j'aimerais juste lui dire, je te donne un pointeur sur un tableau d'utilisateurs (peu importe la taille) et je lui donne la taille en paramètre (ici nb) pour pouvoir boucler correctement dessus et rendre la fonction utilisable quelque soit le nombre d'utilisateurs.

Ce système est toujours pas très claire pour moi pour le moment. Je travaillais plutôt sur java donc je ne me posais pas vraiment de question et je récupérais avec le .length mais là je me sens un peu perdu lol.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Mais non. Si tu passes par un pointeur simple, tu n'as pas besoin de préciser la taille !
Il faut donc adapter :
void initUser(User *user, int nb) {
int i;
for(i=0; i<nb; i++) {
strcpy(user[i].name,"");
user[i].age = 0;
}


T'adaptes également l'appel à la fonction.
Et voilà !
0
Beubeute
 
J'y ai pensé à adapter de cette façon, mais dans ce cas je dois aussi enlever le nombre d'utilisateurs et la boucle pour me permettre d'initialiser qu'un seul utilisateur.
Ensuite je boucle sur initUser et ça marche.

Mais au final ça ne m'avance pas à grand chose de faire ça, ça me fait "gagner" quelques lignes d'initialisation mais j'aurais ma boucle à l'extérieur de la fonction pour initialiser le tableau. J'trouve pas ça vraiment utile.

A moins que tu ne parlais d'une autre méthode que je n'ai pas compris.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Relis bien mon code :

void initUser(User *user, int nb) {
int i;
for(i=0; i<nb; i++) {
strcpy(user[i].name,"");
user[i].age = 0;
}


Tu vois bien que j'ai mis la boucle for() dedans. Cela initialisera chacune des structures de ton tableau.
Dans ta fonction main(), tu as juste à mettre : initUser(user, 2); (pas de boucle for).
0
Beubeute
 
Dans ce cas je ne vais pas modifier le tableau user, non ?
Je vais uniquement modifier une copie du tableau que j'ai envoyé en paramètre mais ça n'initialisera en rien celui que j'ai déclaré dans le main.
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Bah si puisque tu passes par pointeur.
Dis-toi bien qu'en C, on ne peut pas envoyer de tableau en paramètre. On passe en fait la première adresse de la première case du tableau.
Essaie pour t'en convaincre ;-)
0
Beubeute
 
Ah ok ! C'était ça que j'avais pas bien compris, quand tu as écris le *user je voyais ça comme le tableau directement.

Merci de ton aide !
0