Fournir parametre a un tableau de structure static extern
Résolu/Fermé
A voir également:
- Fournir parametre a un tableau de structure static extern
- Tableau croisé dynamique - Guide
- Tableau ascii - Guide
- Comment faire un tableau - Guide
- Trier un tableau excel - Guide
- Comment imprimer un tableau excel sur une seule page - Guide
2 réponses
Sugel
Messages postés
4076
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
725
6 mars 2016 à 16:47
6 mars 2016 à 16:47
Tu ne peux pas faire ça :
tu essaie de réserver à l'avance une taille inconnue.
Tu peux par contre réserver un pointeur vers un tableau de taille connue lors de l'exécution du main, ce qui ne pose pas de problème vu que le main est exécuté en premier.
Deux solutions s'offrent à toi:
allouer ton tableau dans la pile de ton main, comme ceci:
cela pose des problèmes de sécurité et de stabilité, car la taille de ton tableau fera varier le nombre maximum de fonctions imbriquées que tu pourra appeler après son allocation.
Tu peux aussi choisir de l'allouer dynamiquement, sur le tas.
Les défauts cités plus haut ne sont pas présents, mais il y a maintenant la contrainte de libérer la mémoire allouée.
Si c'est une allocation unique, ce n'est pas si grave, mais c'est une mauvaise habitude à ne pas prendre.
Cordialement, Sugel.
tu essaie de réserver à l'avance une taille inconnue.
Tu peux par contre réserver un pointeur vers un tableau de taille connue lors de l'exécution du main, ce qui ne pose pas de problème vu que le main est exécuté en premier.
Deux solutions s'offrent à toi:
allouer ton tableau dans la pile de ton main, comme ceci:
#include <stdio.h> #include <stdlib.h> typedef struct s_tab { int a; int b; int c; } t_tab; t_tab *Tab; int main(int ac, char **av) { int size = atoi(av[1]); printf("Size is %d\n", size); t_tab lTab[size]; Tab = lTab; for (int i = 0; i < size ; i++) Tab[i].a = i; for (int i = 0; i < size ; i++) if (Tab[i].a != i) { printf("error !\n"); return -1; } }
cela pose des problèmes de sécurité et de stabilité, car la taille de ton tableau fera varier le nombre maximum de fonctions imbriquées que tu pourra appeler après son allocation.
Tu peux aussi choisir de l'allouer dynamiquement, sur le tas.
#include <stdio.h> #include <stdlib.h> typedef struct s_tab { int a; int b; int c; } t_tab; t_tab *Tab; int main(int ac, char **av) { int size = atoi(av[1]); printf("Size is %d\n", size); Tab = malloc(size); for (int i = 0; i < size ; i++) Tab[i].a = i; for (int i = 0; i < size ; i++) if (Tab[i].a != i) { printf("error !\n"); return -1; } free(Tab); }
Les défauts cités plus haut ne sont pas présents, mais il y a maintenant la contrainte de libérer la mémoire allouée.
Si c'est une allocation unique, ce n'est pas si grave, mais c'est une mauvaise habitude à ne pas prendre.
Cordialement, Sugel.
Merci Sugel.
voila une réponse comme ont en voudrais a chaque questions !
simple, complet et très bien décrie.
je prend l'option n°2 : allocation dynamique
j'ai suivie tes indications a la lettre mais je ne compile malheureusement pas ....
Mon compilo me dit qu'il ne reconnais pas t_tab "Unknown type name"
et m'indique la ligne ou je déclare mon tableau entre ma structure et mon main()
es que j'ai bien fait de supprimer ma structure dans mon file.h ?
étant donner que je l'ai déplacer au dessus du main() ?
j'ai également supprimer la déclaration du tableau en extern qui s'y trouvé.
merci de votre investissement, j'avance bien grâce a vous !
bonne soirée .
voila une réponse comme ont en voudrais a chaque questions !
simple, complet et très bien décrie.
je prend l'option n°2 : allocation dynamique
j'ai suivie tes indications a la lettre mais je ne compile malheureusement pas ....
Mon compilo me dit qu'il ne reconnais pas t_tab "Unknown type name"
et m'indique la ligne ou je déclare mon tableau entre ma structure et mon main()
es que j'ai bien fait de supprimer ma structure dans mon file.h ?
étant donner que je l'ai déplacer au dessus du main() ?
j'ai également supprimer la déclaration du tableau en extern qui s'y trouvé.
merci de votre investissement, j'avance bien grâce a vous !
bonne soirée .
Sugel
Messages postés
4076
Date d'inscription
jeudi 18 août 2011
Statut
Membre
Dernière intervention
19 juin 2017
725
7 mars 2016 à 02:57
7 mars 2016 à 02:57
tu as le choix:
soit tu inclus ton fichier .h contenant la déclaration de la structure, soit tu la met directement dans ton fichier .c.
il est quand même conseillé d'utiliser un .h.
poste ton code, le mien est valide et compile
soit tu inclus ton fichier .h contenant la déclaration de la structure, soit tu la met directement dans ton fichier .c.
il est quand même conseillé d'utiliser un .h.
poste ton code, le mien est valide et compile
Hello,
effectivement quand je laisse ma structure dans mon file.h sa fonctionne très bien !
merci de ton aide Sugel.
encore une dernière question, est il primordial de réaliser l'allocation dans le main() ?
je doit faire un peu de parsing avant de pouvoir déterminer la taille de mon tableau du coup je voudrais l'allouer dans une fonction a part du main(), mais bien entendue avant de chercher a m'en servir.
effectivement quand je laisse ma structure dans mon file.h sa fonctionne très bien !
merci de ton aide Sugel.
encore une dernière question, est il primordial de réaliser l'allocation dans le main() ?
je doit faire un peu de parsing avant de pouvoir déterminer la taille de mon tableau du coup je voudrais l'allouer dans une fonction a part du main(), mais bien entendue avant de chercher a m'en servir.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
7 mars 2016 à 11:46
7 mars 2016 à 11:46
Non ce n'est pas obligatoire. Mais dans ce cas, il faut passer par un double pointeur.
fiddy
Messages postés
11069
Date d'inscription
samedi 5 mai 2007
Statut
Contributeur
Dernière intervention
23 avril 2022
1 842
7 mars 2016 à 23:13
7 mars 2016 à 23:13
Normal, l'erreur de segmentation. Tu souhaites modifier l'adresse qui est passée en tant que valeur. Voici un exemple :
Je te laisse adapter ce code.
#include <stdio.h> #include <stdlib.h> int* allocation(int ** const tab, const size_t n) { if (n < 0) { return NULL; } *tab = malloc(n * sizeof **tab); return *tab; } int main(void) { int *tab; tab=allocation(&tab,5); if (tab == NULL) { fputs("erreur d'allocation\n", stderr); return EXIT_FAILURE; } /*reste du traitement*/ return EXIT_SUCCESS; }
Je te laisse adapter ce code.
6 mars 2016 à 17:23
t_tab Tab[atoi(av[1]);
et ta version
int size = atoi(av[1]);t_tab lTab[size]; ?
Dans les deux cas, cela est possible en C99...
Note : return -1 n'est pas standard. Il faut mettre : return EXIT_FAILURE.
Note2: tu as oublié d'inclure le stdio.h.
6 mars 2016 à 18:29
6 mars 2016 à 18:51
7 mars 2016 à 02:55
j'ai bien inclus stdio, et osef du code de retour, il ne corresponds à rien de particulier ici
7 mars 2016 à 11:45