Créer plusieurs structures non définies au début

Fermé
JeanCri - 11 déc. 2013 à 13:17
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 11 déc. 2013 à 14:32
Bonjour,

J'essaie depuis un petit moment de stocker divers données dans des structures mais sans fin.

Je vous explique, j'ai une structure personne qui contient un id et un tableau de char

struct people
{
int id;
char peoplefound[10];
};

et j'aimerai pouvoir créer X personne. Un nombre non défini qui serait renseigné par l'utilisateur.

pour ça j'ai utilisé un
struct people taille[ASK];

avec ASK saisie par l'utilisateur. et ensuite je vérifie que tout est créé en affichant une valeur. par exemple l'id.
donc je le défini
taille[i].id = 1;
et je l'affiche dans une boucle for
printf("%i", taille[i].id);

La console m'affiche bien l'id des 40 premiers et plante après. Si je met ASK a 71 il plante a 41, si je le met a 400 il plante a 204 ....

Que faire ?

merci

A voir également:

4 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 11/12/2013 à 14:37
Bonjour,

Si on fait du c99, on peut parfaitement passer une variable à la déclaration d'un tableau.

Ce code est licite, compile et s'exécute correctement avec gcc compilé avec l'option
-std=c99
:

#include <stdio.h>
#include <string.h>

struct people
{
    int id;
    char peoplefound[10];
};

int main(void)
{

    int ask = 2000;
    struct people taille[ask];
    for (int n = 0; n < ask; n++)
    {
        taille[n].id = n;
        strcpy(taille[n].peoplefound, "toto");
        printf("nom : %s\ttaille : %d\n",
                taille[n].peoplefound, taille[n].id);
    }

    return 0;
}

Mais il faut être conscient que l'on fait du c99.


Dal

N.B. : j'ai renommé "ASK" en "ask", car les capitales sont habituellement utilisées en C pour des #define, et non pour des variables, afin que le code ne soit pas trompeur.
1
Bonjour JeanCri,

C'est étrange, pourriez-vous nous montrer votre boucle "for" ainsi que l'attribution des valeurs de chaque bloc contenant "id" ?

Pourriez-vous également nous montrer le message d'erreur lorsque ça plante ?

Par mon expérience, si vous codez en C je vous conseille d'utiliser des listes chainées afin d'avoir un conteneur modulable.

Cordialement.
0
Utilisateur anonyme
11 déc. 2013 à 13:48
salut,


tu alloues de cette manière :

struct people taille[ASK]; 

bon déjà je ne me rappelais pas qu'il fallait préciser le struct, pour moi
people taille[ASK]; 
suffit, mais à vérifier.

Bon sinon ton allocation n'est pas suffisante de mon point de vu, je pense qu'il faut aussi allouer chaque ligne tu tableau, soit faire :


int i = 0;
while( i < ASK )
{
&taille[i] = malloc(sizeof(people));
i++;
}

j'ai un gros doute vis à vis de l'adresse, mais le principe est là : tu alloues un tableau de taille définie mais tu n'alloues pas chaque case du tableau.

si nécessaire je pourrai voir pour compiler un code.

naga
0
Utilisateur anonyme
11 déc. 2013 à 14:10
première chose, le struct est nécessaire ^^.

Bon sinon j'ai un peu changé ton tableau, et ce code fonctionne sans sourciller :


#include <stdio.h>
#include <stdlib.h>

/* run this program using the console pauser or add your own getch, system("pause") or input loop */
struct people
{
int id;
char peoplefound[10];
};
#define ASK 70
int main(int argc, char *argv[]) {

struct people * taille[ASK];

int i = 0;
while(i<ASK)
{
taille[i] = (struct people*) malloc(sizeof(struct people));
taille[i]->id = i;
strcpy(taille[i]->peoplefound,"joueur");
i++;
}
i = 0;
while(i<ASK)
{
printf("%d:%s\n",taille[i]->id,taille[i]->peoplefound);
i++;
}

i = 0;
while(i<ASK)
{
free(taille[i]);
i++;
}
//free(taille);
system("PAUSE");
return 0;
}

naga
0
En effet, pour déclarer la structure, tu fais comme ci-décris: struct people taille[ASK]
De plus, il serait préférable de faire un typedef pour la clarté du code.

typedef struct people
{
int id;
char peoplefound[10];
} t_people;

struct people taille[ASK] devient t_people taille[ASK]

Cordialement.
0
Utilisateur anonyme
11 déc. 2013 à 14:19
ah merci ! j'avais totalement oublié typedef =D mes années de c commencent à dater ^^
0
Ca fait également peut de temps que je code moins en C aussi et à vrai dire, ça se ressent vite ^^ derien :) !!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
11 déc. 2013 à 14:23
Houlà !!
Attention, "struct people taille[ASK]; " déclare un tableau statique. C'est à dire que ASK doit être connu à la compilation, ou passé en argument à la fonction qui le déclare :
void fct(int ASK)
{
    struct people taille[ASK];
} 

et encore ce dernier est à vérifier.
L'idéal pour faire des tableau dynamique, c'est de passer par les pointeurs, un peu comme naga a essayé de le faire, mais de la mauvaise façon. C'est plutôt :
struct people *taille;
taille=malloc(ASK*sizeof(people));// on suppose ASK déjà renseigné par 
l'utilisateur.

Une liste chainée est aussi une bonne solution.
0
Utilisateur anonyme
11 déc. 2013 à 14:26
mmh oui j'avais justement défini le ask en préproc, j'avais zapé que c'était suite à une saisie x)
0