Fournir parametre a un tableau de structure static extern

Résolu/Fermé
Utilisateur anonyme - 6 mars 2016 à 15:17
 Utilisateur anonyme - 8 mars 2016 à 11:32
Bonjour,

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:

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
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:
#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.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
6 mars 2016 à 17:23
C'est quoi la différence entre son 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.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022
6 mars 2016 à 18:29
La différence est dans le fait que le code est dans une fonction et pas en global.
0
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 842
6 mars 2016 à 18:51
Ah oui, j'avais pas fait attention que c'était en global. J'enlève cette partie-là de mon commentaire alors :-).
0
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:55
hé, j'ai rien fait moi :c
j'ai bien inclus stdio, et osef du code de retour, il ne corresponds à rien de particulier ici
0
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:45
Ben, dans ton poste tu parles des bonnes habitudes à prendre et tu ne mets pas une valeur standard en retour du main(). C'est dommage.
0
Utilisateur anonyme
6 mars 2016 à 22:36
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 .
0
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
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
0
Utilisateur anonyme
7 mars 2016 à 11:08
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.
0
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
Non ce n'est pas obligatoire. Mais dans ce cas, il faut passer par un double pointeur.
0
Utilisateur anonyme
7 mars 2016 à 12:24
peut tu me l'illustrer avec le bout de code fournie plus haut pour que je soit certain de bien comprendre ?

car effectivement j'ai une bonne vielle erreur de segmentation qui débarque de nul part sans raison apparente donc il y a des chance que ce soit a cause de sa ..
0
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
Normal, l'erreur de segmentation. Tu souhaites modifier l'adresse qui est passée en tant que valeur. Voici un exemple :
#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.
0