bonjour, est-il possible de connaitre la taille d'un tableau static const sans utiliser de compteur en C++ ?
merci
Version imprimable
bonjour, est-il possible de connaitre la taille d'un tableau static const sans utiliser de compteur en C++ ?
merci
Salut,
donne la taille d'un tableau statiqueCode:sizeof(tab)/sizeof(*tab)
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")
donc pas moyen de faire autrement qu'en C ?
Tu n'as pas lu ma réponse.
je n'arrive pas à aller sur la page :(
Tu enregistres le fichier et ouvres avec ton éditeur préféré, c'est à la fin.
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 ?
Nope. Balances lui un pointeur et osberves la différence.
ça marche mais pourquoi ... et surtout quelles est la différences entre tableau constant et dynamique à ce niveau ?
Code:
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; }
le pointeur il ne marche pas top.Citation:
array_help.cc: In function «int main()»:
array_help.cc:41: erreur: no matching function for call to «array_size_helper(int*&)»
edit : luc tu peux m'expliquer :
s'il te plait ?Code:template<typename T, std::size_t N> array<N> array_size_helper(T (&)[N]);
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)
En fait je vois à peu prés ce qu'est un template mais c'est ça que je ne comprend pas :
le "<..., ...>" et puis où est le code ?Code:<typename T, std::size_t N>
Sinon c'est normal que ça ne marche pas avec des pointeurs (se serait parce que le tableau n'est pas forcément contigue ?)
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.
ok, merci.