Structure en c

Résolu/Fermé
donina Messages postés 3 Date d'inscription mercredi 26 décembre 2007 Statut Membre Dernière intervention 12 juin 2008 - 26 déc. 2007 à 02:08
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 - 28 déc. 2007 à 15:11
Bonjour,

Je débute en c et je sais pas comment initialiser un tableau de structures, ni dans le int main(void) ni en passant par une fonction init.
Y aurait-il un lien avec l'écriture pointeurs ? J'en profie pour demander comment écrire un .h avec la définition de la structure.Merci d'avance

Fichier carnet.c

#define NP 2
#define LG_LIG 128
#include <stdio.h>

typedef struct personnes { /* définition du tableau de structures */
int id;
char nom[20];
char prenom[20];

} personnes;

void init(personnes carnet[],int np) /* initialisation du tableau de structures */
{
int i;

for (i=0;i<np;i++)
{

/*carnet=NULL;
&carnet[i]={,"toto","titi"};*/ Essais sans succés

carnet[i]->id=0; Essais sans succés
carnet[i]->nom="";
carnet[i]->prenom=NULL;
}

}
void affiche(struct personnes carnet[],int np) /* affichage des données du carnet */
{
int i;

for (i=0;i<np;i++)
{
printf("Personne %d %s %s",carnet[i].id,carnet[i].nom,carnet[i].prenom);printf("\n");
}
}


void entree(struct personnes carnet[],int np)
{
int i;
char ligne[LG_LIG+1];

for (i=0;i< NP;i++)
{


printf("Personne %d :",i);
gets(ligne);
sscanf(ligne, "%d %s %s",&carnet[i].id,&carnet[i].nom,&carnet[i].prenom);
printf("\n");
}
}
/**************************************************************************/
/***************** PROGRAMME PRINCIPAL **********************************/

int main(void)
{

int i;

personnes carnet[NP]; /* définition du carnet */


void init(personnes [],int nb);
void affiche(personnes [],int nb);
void entree(personnes [],int nb);


init(carnet,NP);



for (i=0;i<NP;i++)
{

/*carnet=NULL;
&carnet[i]={,"toto","titi"};*/

carnet[i]->id=0;
carnet[i]->.nom="";
carnet[i]->prenom="";

}

entree(carnet,NP);
affiche(carnet,NP);

}

4 réponses

mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
26 déc. 2007 à 03:31
pour initialiser avec les pointeurs tu peux faire comme ça
typedef struct personnes { /* définition du tableau de structures */
int id;
char *nom;
char *prenom;

} personne;


void init(personne carnet[],int np) // initialisation du tableau de structures
{
int i;

    for (i=0;i<np;i++)
    {
        carnet[i].nom=(char *) malloc(20);
        carnet[i].prenom=(char *) malloc(20);

        carnet[i].id=0; 
        carnet[i].nom=" ";
        carnet[i].prenom=" ";
    }
}
0
Bonjour,

Tu es distrait ce matin ,mype. Des abus hier ?
carnet[i].nom=(char *) malloc(20);
suivi de
carnet[i].nom=" ";
ne fait probablement pas ce que tu crois.
La première ligne alloue de la mémoire et met l'adresse de cette mémoire dans carnet[i].nom
La seconde ligne change carnet[i].nom pour pointer sur une zone initialisée à " ". L'adresse de la mémoire allouée précédemment est perdue. Le malloc n'a servi a rien. Pire, il crée "un fuite de mémoire" puisqu'on ne saura jamais en faire un free().

strcpy (carnet[i].nom," "); serait sûrement préférable

idem pour prénom, bien sûr
0
le père > le père
26 déc. 2007 à 12:31
De plus, (distrait moi aussi, hum, hum...) pas de malloc du tout, carnet[i] est déjà un tableau de 20 char, il n'y a rien à allouer
0
Bonjour donina

Le compilateur sort beaucoup d'erreurs... Allons-y calmement

1- structure ou pointeur sur structure
carnet[i]->id n'est pas correct. Il faut utiliser la -> quand tu as un pointeur sur une structure et le point quand tu as la structure elle-même. Ici, carnet[i] désigna la structure elle-même, il faut utiliser le point : carnet[i].id.
Même chose bien sûr pour les autres champs de la structure

2- affectation de tableau
Les champs nom et prenom désignent des tableau de caractères. En C, tu ne peux pas donner une valeur à un tableau avec l'affectation simple '='. Si ce tableau doit contenir une chaîne de caractères, le plus simple est d'utiliser strcpy :
strcpy (carnet[i].nom,"");


commençons par ça
0
re- Bonjour

comment écrire un .h avec la définition de la structure

ça, il n'y a pas plus facile.

Tu recopies ta définition dans un fichier que tu appelles comme tu veux avec une extension en .h, par exemple personnes.h
Dans les fichier .c ou .cpp où tu l'utilises, tu ajoutes #include "personnes.h" (et tu enlèves la définition, bien sur)

Il n'est pas recommandé de créer un fichier .h pour chaque type que tu crées, ça devient vite la pagaille. Regroupe les définitions qui ont un certain rapport entre elles ( #define constantes, prototypes de fonctions, structures..)
0
Bonjour,

Merci pour tes conseils. Mon petit programme fonctionne.
Pour le .h, c'était juste pour essayer.

A tantôt.
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436
26 déc. 2007 à 15:48
oula.. merci le pere en effet je n'avais pas l'esprit tres claire c'est vrai que pour les chaine de caractere le "=" n'est pas correct

fais comme le pere t'as dit utilise strcpy() pour initialiser dans ta fonction init et n'ouble pas d'inclure la bibliotheque string.h au debut
for (i=0;i<np;i++)
{
carnet[i].id=0; 
strcpy(carnet[i].nom," ");
strcpy(carnet[i].prenom," ");
}

ensuite dans ta fonction entree() mon compilateur n'aime pas trop gets() je te conseille d'utiliser un simple scanf
scanf( "%d""%s""%s",&carnet[i].id,&carnet[i].nom,&carnet[i].prenom);


voila avec ces quelques corrections ton programme fonctionne chez moi...

bonne chance ;)
0
Bonjour,

L'initialisation fonctionne avec strcpy mais en conservant la définition.
typedef struct personnes {
int id;
char nom[20];
char prenom[20];

} personnes;

Un grand merci.
0
mype Messages postés 2435 Date d'inscription jeudi 1 novembre 2007 Statut Membre Dernière intervention 16 août 2010 436 > donina
28 déc. 2007 à 15:11
oui c'est normal si tu veux initialiser avec les pointeurs faut utiliser des malloc avant

si tu as plus de probleme n'oublie pas de metre en resolu ;)
0