Structure en c
Résolu
donina
Messages postés
3
Date d'inscription
Statut
Membre
Dernière intervention
-
mype Messages postés 2435 Date d'inscription Statut Membre Dernière intervention -
mype Messages postés 2435 Date d'inscription Statut Membre Dernière intervention -
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);
}
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);
}
A voir également:
- Structure en c
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Structure url - Guide
- Trouvez l'erreur dans la structure du document et corrigez-la. - Forum Word
- Error pdf structure 40 - Forum PDF
4 réponses
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=" "; } }
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
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
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..)
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..)
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
ensuite dans ta fonction entree() mon compilateur n'aime pas trop gets() je te conseille d'utiliser un simple scanf
voila avec ces quelques corrections ton programme fonctionne chez moi...
bonne chance ;)
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 ;)
Tu es distrait ce matin ,mype. Des abus hier ?
suivi de
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