IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C Discussion :

Déclaration de référence pour un tableau dans un header


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Par défaut Déclaration de référence pour un tableau dans un header
    Bonjour,

    Dans le code que j'utilise, j'ai plusieurs variables globales, dont un tableaux de type int TAB[2][n].

    Définis dans l'un des fichiers file1.c, j'aimerais m'en servir dans un autre fichier file2.c.
    J'ai donc créé un fichier Entete.h destiné à être inclus dans file2.c.

    Quelle forme aura ma déclaration de référence dans Entente.h ?
    Celle-ci ne semble pas convenir au compilateur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    extern int TAB[2][n];
    Faut il passer par le pointeur comme ceci ?

    Merci de votre aide.

  2. #2
    Invité
    Invité(e)
    Par défaut
    C'est normal que cela ne lui plaise pas. Et il râle à juste raison !

    Tu lui dis qu'il existe quelque part une variable, qui est un tableau de taille variable.
    Comment tu veux que, pauvre petit compilateur qu'il est, puisse savoir qu'elle sera la taille de ce tableau, et jusque dans quel mesure il pourra l'utiliser ?

    Le soucis avec ton tableau à taille dynamique, là, c'est que tu ne pourras le lui faire avaler.

    Soit tu lui donnes une adresse fixe, soit tu es dans l'obligation d'utiliser un pointeur. L'avantage du pointeur est qu'il te permet justement de masquer cette partie dynamique.
    Par contre, il faut du coup faire beaucoup plus attention dans son utilisation. C'est moins "parlant" qu'un tableau.

    Je dirais que d'une manière générale, essaye d'éviter ce style d'écriture, même si cela fait partie de la norme C99. Cela amène beaucoup d'embrouille pour un avantage somme-toute assez réduit (je trouve, personnellement).

    Quand à la manière de présenter la chose...

    Si tu es courageux: extern int *montableau Mais tu devras alors gérer manuellement chaque niveau de ton tableau.
    Sinon, pour paraphraser ce que j'ai pu lire ici : "Une étoile par dimension supplémentaire" pour un tableau, donc extern int **montableau dans ton cas. (mais je m'attends à ce que l'on me reprenne sur cette affirmation.)

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par archMqx. Voir le message
    ...
    Soit tu lui donnes une adresse fixe, soit tu es dans l'obligation d'utiliser un pointeur. L'avantage du pointeur est qu'il te permet justement de masquer cette partie dynamique.
    Par contre, il faut du coup faire beaucoup plus attention dans son utilisation. C'est moins "parlant" qu'un tableau.
    Ce n'est pas moins parlant, c'est autre chose.

    Citation Envoyé par archMqx. Voir le message
    ...
    Je dirais que d'une manière générale, essaye d'éviter ce style d'écriture, même si cela fait partie de la norme C99. Cela amène beaucoup d'embrouille pour un avantage somme-toute assez réduit (je trouve, personnellement).
    A quelle particularité de la C99 fais-tu allusion? aux VLA ?

    Citation Envoyé par archMqx. Voir le message
    ...
    Si tu es courageux: extern int *montableau Mais tu devras alors gérer manuellement chaque niveau de ton tableau.
    Sinon, pour paraphraser ce que j'ai pu lire ici : "Une étoile par dimension supplémentaire" pour un tableau, donc extern int **montableau dans ton cas. (mais je m'attends à ce que l'on me reprenne sur cette affirmation.)
    Et tu ne te trompes pas : il n'y a aucun rapport entre le nombre de dimensions et d'étoiles. C'est une faute de dire ceci, même avec l'intention de faire simple, car cette affirmation est fondamentalement fausse et induit une incompréhension totale des tableaux en C.

    D'un autre coté, je ne suis pas sûr qu'on puisse avoir une déclaration extern qui ne soit pas strictement identique à celle de la variable.

    De toute façon, int TAB[2][n] ne peut pas être en allocation statique mais doit être en allocation automatique (variable locale) et ne peut donc figurer en extern. Il faut revoir la conception des structures de données.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Par défaut
    Bonjour et avant tout, un grand merci de vos réponses !

    Par rapport à celles-ci, il me reste encore quelques points problèmatiques:

    * Tout d'abord la taille de TAB n'est pas variable puisque n ne change pas dans le programme. Mais j'imagine que pour la déclaration de référence, le fait que n varie ou pas dans le reste du code ne change rien à la confusion de cette écriture pour le compilateur.

    *
    Si tu es courageux: extern int *montableau Mais tu devras alors gérer manuellement chaque niveau de ton tableau
    Que signifie "gérer manuellement chaque niveau de mon tableau" ?

    *
    Je dirais que d'une manière générale, essaye d'éviter ce style d'écriture, même si cela fait partie de la norme C99. Cela amène beaucoup d'embrouille pour un avantage somme-toute assez réduit (je trouve, personnellement).
    Je ne comprend pas de quel style d'écriture tu parles. Parles tu de l'écriture 'extern' dans les headers ? De la déclaration de référence avec un pointeur ?

    * D'après ce que j'ai maintenant compris, je vais déclarer TAB dans le header en passant par son adresse :extern int* TAB
    Si cela ne passe du fait que la déclaration extern n'est pas strictement identique à celle de la variable, je pensais donc changer la déclaration-définition de TAB et en faire un pointeur.
    Par exemple dans le main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int** TAB;
    TAB= (int**) malloc(2 * sizeof(int*));
    for (i = 0; i < 2; i++)
            TAB[i] = (int*) malloc(n * sizeof(int));
    et dans le header :

    Est-ce que cela équivalent à l'usage d'un tableau ? (Je ne suis pas encore sûre de moi sur les pointeur et allocations de mémoire)

    * dernière chose sur le principe : j'ai lu qu'il n'était pas recommandé d'utiliser beaucoup de variables globales. Mais il est également déconseillé d'avoir d'énormes liste d'argument à
    l'entrée des fonctions.... Comment faire alors ??

    Merci encore à vous

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    124
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2010
    Messages : 124
    Par défaut
    Je viens d'avoir une idée, comme ma variable n ne varie pas de tout le programme, je peux en faire une macro et définir dans le header :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define N 100
    extern int TAB[2][N];

    Qu'en pensez vous ?

  6. #6
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Que ca change tout.

    Une macro est remplacé par son "texte de remplacement" à la précompilation.

    Ce qui sera effectivement compilé est extern int TAB[2][100];. Et là, tu as bien un tableau de taille connue à la compilation.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2010] Formule matricielle pour filtrer tableau dans Plage Nommée
    Par Gpadidee dans le forum Excel
    Réponses: 1
    Dernier message: 28/02/2014, 01h05
  2. Réponses: 4
    Dernier message: 27/08/2013, 20h10
  3. CSS pour un tableau dans du XHTML
    Par darkterreur dans le forum Mise en page CSS
    Réponses: 16
    Dernier message: 18/06/2010, 10h20
  4. Tableau dans un header
    Par ancrou dans le forum C++
    Réponses: 14
    Dernier message: 10/07/2008, 21h20
  5. Réponses: 1
    Dernier message: 23/09/2006, 00h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo