Allocation dynamique de structure c [Résolu/Fermé]

Signaler
Messages postés
206
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
-
[Dal]
Messages postés
5400
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
24 février 2020
-
Bonjour,

s'il vous plaît , je voudrais allouer une structure dynamiquement , mais quand essaie , sa bugg : "<< expected expression before 'personne' >>", voilà mon code , pourriez vous m'aider ,

struct identit
{
char nom[10] ;
int age;
char sexe[1];
} ;
typedef struct identit identite;

int nbredamis =0 , i;
typedef struct ident *personne;

printf(" ce programme permet d'afficher un tableau ne connaissant pas la taille au depart \n \n");
printf("combien d'amis avez vous ? ");
scanf("%d",&nbredamis);
personne = malloc(sizeof(identite) * nbredamis);
if ( personne == NULL)
{
exit(0);
}
if ( nbredamis > 1)
{
for ( i=0 ; i < nbredamis ; i++)
{
printf(" veuillez saisir le nom de l\'ami %d \n",i+1);
scanf("%s",&personne[i].nom);
printf("\n veuillez saisir l\'age de l\'ami %d \n",i+1);
scanf("%d",&personne[i].age);
printf("\n veuillez saisir le sexe de l\'ami %d \n",i+1);
scanf("%s",&personne[i].sexe);

printf("\n \n");
}
}

for ( i=0 ; i < nbredamis ; i++)
{
printf(" ami %d \n",i+1);
printf("%s\n",personne[i].nom);
printf("%d\n",personne[i].age);
printf("%s\n",personne[i].sexe);
printf("\n \n");

}

3 réponses

Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 649
Tu n'as pas déclaré la variable Personne.
Essaie : Identite *personne;

typedef struct ident *personne;
Et supprime ça, car ce n'est pas une déclaration. Ou alors explique, ce que tu souhaites faire ?

if ( nbredamis > 1)
Pourquoi ne pas inclure nbredamis=1 ?

scanf("%s",&personne[i].nom);
Il ne faut pas mettre de & ici. Pareil pour l'autre chaîne.

Et enfin n'oublie pas de faire un free(...);

Cdlt,

Google is your friend
Messages postés
206
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
6
Bien sur , " tu l'avais pas vu car j'ai copié une partie du code " , mais merci quand même de me le rappeler , ok , je vais suivre tes intructions.

sinon que j'ai réalisé un tableau de structures sans passer par l'allocation dynamique , mais bon , je ne trouve pas ça professionnel , alors , je veux passer par l'allocation dynamique , voici mon code , " sans allocation dynamique "


#include <stdio.h>
#include <stdlib.h>
int main()
{
int n = 0 , i ;
typedef struct
{ char nom[15];
int age;
}identite;

identite personne[n+1];
printf(" veuiller saisir le nombre d\'enregistrments ");
scanf("%d",&n);

for ( i = 0 ; i <n ; i++)
{
printf("veuiller saisir le nom de la personne %d ",i+1);
scanf("%s",&personne[i].nom);
printf("\n veuiller saisir son age ");
scanf("%d",&personne[i].age);
printf("\n\n");
}

for (i = 0; i<n ; i++)
{
printf("%s\n",personne[i].nom);
printf("%d",personne[i].age);
printf("\n\n");
}
return 0;
}
fiddy
Messages postés
11137
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
18 octobre 2016
1 649
identite personne[n+1];
Gloups. n vaut 0 donc tu fais : identite personne[1];
De plus attention, à cette utilisation.Cela marche en C99, mais n'est pas correct en C89/90. Dans la pratique, on utilise plutôt malloc(). Pour l'utiliser, il suffit de respecter ce que je t'avais dit plus haut et de persister.

scanf("%s",&personne[i].nom);
Bis repetita placent (t'as pas tenu compte de mes remarques).

Cdlt,
Messages postés
206
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
6
je voulais tester ce code , mais ,sa ne passe toujours pas , pourrais tu m'aider ?

int nbreDepersonne = 0;
struct identite
{
char nom[15];
int age;
char prenom[20];
};
identite *personne;
printf("veuiller saisir le nombre de personnes ");
scanf("%d",&nbreDepersonne);

personne = malloc (sizeof(identite)* nbreDepersonne)
if (personne != NULL)
{
printf(" \n sa marche youpi");
} else {
printf(" \n sa marche pas ");
exit(0);
}

// bien sur le free(...) est à bien à la suite.
yaorens
Messages postés
206
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
6
Voici mon code , je ne l'ai pas encore modifier entièrement , je voudrais d'abord tester si l'allocation de la taille demandée est possible avant de continuer à coder et donner des valeurs aux différentes variables .

#include <stdio.h>
#include <stdlib.h>
int main()
{
    int nbreDepersonne = 0;
    struct identit
    {
        char *nom[15];
        int *age;
        char *prenom[20];
    };
    identit identite; //je crée la structure identite
    typedef struct identite *personne ;// je crée une structure pointeur qui va pointer sur identite
    printf("veuiller saisir le nombre de personnes ");
    scanf("%d",&nbreDepersonne);

    personne = malloc (sizeof(identite)* nbreDepersonne) // allocation dynamiques de nbreDePersonnes cases de type stuctures
    if (personne != NULL)
    {
        printf(" \n sa marche youpi");


    }
    else
    {
        printf(" \n sa marche pas ");
        exit(0);
    }

    free(personne);
   return 0;
}
yaorens
Messages postés
206
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
6
Voici les erreurs qui me sont notifiés
-------------- Build: Debug in chainesdecaracteresenc ---------------

Compiling: main.c
D:\chainesdecaracteresenc\main.c: In function 'main':
D:\chainesdecaracteresenc\main.c:12: error: 'identit' undeclared (first use in this function)
D:\chainesdecaracteresenc\main.c:12: error: (Each undeclared identifier is reported only once
D:\chainesdecaracteresenc\main.c:12: error: for each function it appears in.)
D:\chainesdecaracteresenc\main.c:12: error: expected ';' before 'identite'
D:\chainesdecaracteresenc\main.c:17: error: expected identifier or '(' before '=' token
D:\chainesdecaracteresenc\main.c:24: error: 'else' without a previous 'if'
D:\chainesdecaracteresenc\main.c:30: error: expected expression before 'personne'
Process terminated with status 1 (0 minutes, 0 seconds)
7 errors, 0 warnings
[Dal]
Messages postés
5400
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
24 février 2020
859
Salut yaorens,

Pour tes erreurs de compilation, commence déjà par celle-là

"identit" n'est pas un type, c'est une étiquette de structure

Pour en faire un type que tu puisses utiliser dans tes déclarations de variables, fais-en un typedef.

Comme cela :
    typedef struct
    {
        char nom[15];
        int age;
        char prenom[20];
    } IDENTIT;

Plusieurs remarques :
- j'ai retiré les * que tu avais mis sur nom, prenom et age. Autrement, tu déclarais des tableaux de pointeurs sur char, ou un pointeur sur int (et je crois pas que c'est ce que tu veux faire)
- il vaut mieux identifier les types créés par l'utilisateur, visuellement IDENTIT se remarque mieux

Cela te permet de faire :
    IDENTIT *une_personne;      /* déclaration d'un pointeur sur une 
                                   structure IDENTIT */

Pour le reste du code... Ben tu peux faire de nombreuses façons. Si tu veux allouer directement un bloc de mémoire pour toutes les structures, il te faudra un moyen de le parcourir.

Le pointeur "une_personne", par exemple :-)


Dal
yaorens
Messages postés
206
Date d'inscription
dimanche 5 avril 2009
Statut
Membre
Dernière intervention
30 mai 2013
6
Dal , je peux faire de diverses façons , j'ai beau faire , mais j'avoue que ce n'est pas aussi facile que s'en a l'air , alors stp , tu pourrais écrire un code en c permettant de faire une allocation dynamique de structure pour que je puisse mieux voir ?
[Dal]
Messages postés
5400
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
24 février 2020
859
Salut yaorens,

Bon, alors, en partant d'un type de structure comme celui-là , évoqué dans les échanges précédents :

#define MAX_LEN_NOM 15        
#define MAX_LEN_PRENOM 20        

typedef struct        
{        
    char nom[MAX_LEN_NOM];        
    int age;        
    char prenom[MAX_LEN_PRENOM];        
} IDENTIT;

et, pour être plus correct sémantiquement, disons en déclarant plutôt :

IDENTIT *toutes_les_personnes;

Par exemple, tu dois pouvoir faire :

toutes_les_personnes = malloc(sizeof(IDENTIT) * nbreDepersonne);

Pour tout allouer d'un coup comme tu voulais le faire. Puis :

int i;        

if (toutes_les_personnes != NULL)        
{        
    for (i = 0; i < nbreDepersonne; i++)        
    {        
        (void)snprintf(toutes_les_personnes[i].nom, MAX_LEN_NOM, "nom%d", i);        
        (void)snprintf(toutes_les_personnes[i].prenom, MAX_LEN_PRENOM, "prenom%d", i);        
        toutes_les_personnes[i].age = i;        
    }        
}        
else        
{        
    printf("allocation impossible\n");        
    exit(EXIT_FAILURE);        
}        
free(toutes_les_personnes);

C'est possible car chaque élément a une taille fixe, dont la taille est connue du compilateur.

Est-ce que cela t'éclaire ?

Si tu veux mettre des éléments de taille variable dans ta structure, il faudra les allouer eux-mêmes, mettre chaque pointeur dans un tableau de pointeurs, qui lui-même devra être préalablement alloué pour accueillir nbreDepersonne pointeurs sur des pointeurs de ta structure (et il faudra correctement libérer la mémoire en faisant des free en sens inverse).

Si tu veux être capable de retirer et insérer des éléments, dans une liste, c'est plutôt une liste chaînée que tu voudras utiliser, etc.

Cherche "structures de données en C" sur Google.


Dal