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 :

taille tableau statique


Sujet :

C++

  1. #1
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut taille tableau statique
    bonjour, est-il possible de connaitre la taille d'un tableau static const sans utiliser de compteur en C++ ?

    merci

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Août 2007
    Messages
    190
    Détails du profil
    Informations personnelles :
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Août 2007
    Messages : 190
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sizeof(tab)/sizeof(*tab)
    donne la taille d'un tableau statique

  3. #3
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Et si c'est un pointeur, cela compile quand même.
    http://hermitte.free.fr/Info/C++/lib...array_help.hpp

    Il y a d'autres façons de faire (Matthew Wilson consacre une section de son Imperfect C++ à ce "problème")
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    donc pas moyen de faire autrement qu'en C ?

  5. #5
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tu n'as pas lu ma réponse.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  6. #6
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    je n'arrive pas à aller sur la page

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tu enregistres le fichier et ouvres avec ton éditeur préféré, c'est à la fin.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    ok, desolé j'avais cru voir ph et non hpp.

    par contre je ne vois pas la différence, c'est du sizeof aussi, non ?

  9. #9
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Nope. Balances lui un pointeur et osberves la différence.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  10. #10
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    ça marche mais pourquoi ... et surtout quelles est la différences entre tableau constant et dynamique à ce niveau ?

  11. #11
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main(void)
    {
    	int s[]={1,2,3,4,5,10}, *t;
    	cout << array_size(s) << endl;
     
    	t=new int[10];
     
    	cout << sizeof(t)/sizeof(*t) << endl;
    	cout << array_size(t) << endl;
     
    	delete t;
     
    	return 0;
    }
    array_help.cc: In function «int main()»:
    array_help.cc:41: erreur: no matching function for call to «array_size_helper(int*&)»
    le pointeur il ne marche pas top.

    edit : luc tu peux m'expliquer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<typename T, std::size_t N>	array<N> array_size_helper(T (&)[N]);
    s'il te plait ?

  12. #12
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Ne pas oublier qu'un pointeur et qu'un tableau sont deux choses complètement différentes.
    Même si un tableau est implicitement convertible en pointeur, ce n'en est pas un.

    <expérience>
    La signature de la fonction que tu viens d'écrire, fais sauter le template, et remplace les arguments du template par les vrais caractéristiques de ton tableau (type et taille). Définis une fonction de même nom qui prend un pointeur et amuse toi à passer tableaux comme pointeurs. Tu verras alors que le langage est capable de distinguer les deux types de données.
    </>

    Seulement, si on veut un moyen générique de reconnaitre des tableaux, il faut pouvoir retarder la définition de leurs caractéristiques jusqu'au dernier moment.

    C'est là qu'entrent en scène les fonctions templates: elles ont la particularité de s'adapter automatiquement aux arguments qui leur sont passés. Et là, on a tout : une fonction capable de déterminer toute seule type et taille d'un tableau statique. cf toutes les fonctions begin() et end() du fichier.

    Mais .. on veut plus: pouvoir manipuler la taille comme une expression constante résolue à la compilation. Là, il faut feinter en exploitant une caractéristique du langage: un sizeof n'exécute pas ce qu'il reçoit en argument. Mais il est résolu à la compilation. Le type de la donnée renvoyée est connu à la compilation, c'est array<N>. Et donc sa taille aussi. Et bingo.

    Il y a d'autres gens qui l'avaient mieux expliqué que moi ... mais alors où ...? Sur artima peut-être ? Ou si tu cherches le message-id de la conversation (s'étant tenue dans fclc++) dans les archives de fclc++ sur googlegroups (conversation qui a donné lieu à ce code)
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  13. #13
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    En fait je vois à peu prés ce qu'est un template mais c'est ça que je ne comprend pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <typename T, std::size_t N>
    le "<..., ...>" et puis où est le code ?

    Sinon c'est normal que ça ne marche pas avec des pointeurs (se serait parce que le tableau n'est pas forcément contigue ?)

  14. #14
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Entre les chevrons, ce sont les arguments du template (là, regarde un cours ou autre sur le sujet)

    Sinon, comme je le disais, sizeof n'évaluera pas le résultat de la fonction, tout ce qu'il évalue (façon de parler vu que cela se passe à la compilation), c'est la taille de la donnée renvoyée par la fonction. Donc la déclaration de la fonction suffit. Pas besoin de sa définition.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  15. #15
    Membre éclairé Avatar de Rniamo
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    508
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 508
    Par défaut
    ok, merci.

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

Discussions similaires

  1. Adresse et taille d'un tableau statique
    Par Aspic dans le forum C
    Réponses: 16
    Dernier message: 31/03/2014, 20h58
  2. Réponses: 5
    Dernier message: 12/12/2013, 11h43
  3. Réponses: 5
    Dernier message: 02/05/2009, 15h27
  4. Réponses: 7
    Dernier message: 21/12/2005, 16h44
  5. char *, string et tableau statique ou dynamique
    Par salseropom dans le forum C
    Réponses: 2
    Dernier message: 05/12/2005, 11h33

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