Fournir parametre a un tableau de structure static extern
Résolu
Utilisateur anonyme
-
Utilisateur anonyme -
Utilisateur anonyme -
Bonjour,
j'ai un tableau de structure en global plutôt cool que j'ai définie dans mon fichier.h
Je voudrais que ce dernier tableau static soit de taille un int passé en paramètre du main()
voici un aperçut de ce que je cherche a faire.
main.c
Comment faire pour que ma global récupère l'argument de mon main ?
j’attends vos réponses avec impatience.
merci.
j'ai un tableau de structure en global plutôt cool que j'ai définie dans mon fichier.h
typedef struct s_tab { int a; int b; int c; } t_tab; extern t_tab Tab[ ???? ];
Je voudrais que ce dernier tableau static soit de taille un int passé en paramètre du main()
voici un aperçut de ce que je cherche a faire.
main.c
t_tab Tab[atoi(av[1]); int main(int ac, char **av) { for (int i = 0; i < 1000; i++) Tab[i] = i; }
Comment faire pour que ma global récupère l'argument de mon main ?
j’attends vos réponses avec impatience.
merci.
A voir également:
- Fournir parametre a un tableau de structure static extern
- Tableau word - Guide
- Trier un tableau excel - Guide
- Tableau ascii - Guide
- Remettre parametre usine pc - Guide
- Parametre dns - Guide
2 réponses
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 .
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.
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.
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.
j'ai bien inclus stdio, et osef du code de retour, il ne corresponds à rien de particulier ici