Créer plusieurs structures non définies au début
JeanCri
-
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
[Dal] Messages postés 6205 Date d'inscription Statut Contributeur Dernière intervention -
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
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
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
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:
- Créer plusieurs structures non définies au début
- Comment créer un groupe whatsapp - Guide
- Créer un compte google - Guide
- Créer un lien pour partager des photos - Guide
- Créer un compte gmail - Guide
- Créer un compte instagram sur google - Guide
4 réponses
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
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.
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.
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.
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.
salut,
tu alloues de cette manière :
bon déjà je ne me rappelais pas qu'il fallait préciser le struct, pour moi
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 :
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
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
première chose, le struct est nécessaire ^^.
Bon sinon j'ai un peu changé ton tableau, et ce code fonctionne sans sourciller :
naga
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
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 :
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 :
Une liste chainée est aussi une bonne solution.
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.