#1 Le 31/07/2014, à 21:36
- moi4567
[C++] Taille d'un tableau par un pointeur.
Bonjour à tous
Je suis en ce moment sur un programme en C++ où j'ai besoin de connaitre la taille d'un tableau (de string) seulement à l'aide d'un pointeur. Plus en détail, j'ai une fonction qui nécessite un tableau. Je me retrouve donc à l’intérieur de cette fonction avec un pointeur sur le tableau en question.
En temps normal pour retrouver la taille d'un tableau je fait :
sizeof(tableau) / sizeof(tableau[0])
Mais là je n'ai accès qu'au pointeur et non pas au tableau, la valeur de "tableau" est donc l'adresse de ce fameux tableau et nom pas le tableau entier .
J'ai toujours la solution de rendre mon tableau global mais j'aimerais vraiment éviter ça.
Merci d'avance
Hors ligne
#2 Le 01/08/2014, à 16:40
- claudius01
Re : [C++] Taille d'un tableau par un pointeur.
Bonjour,
Je suis en ce moment sur un programme en C++ où j'ai besoin de connaitre la taille d'un tableau (de string) seulement à l'aide d'un pointeur. Je me retrouve donc à l’intérieur de cette fonction avec un pointeur sur le tableau en question.
Dans cette fonction, la seule connaissance de ce pointeur ne permettra jamais de connaître la taille sur l'objet pointé (Normal: l'adresse d'une maison dans une rue ne permet pas de connaître le nombre d'habitants de cette rue ;-).
C'est effectivement très bien de ne pas rendre global ce tableau (ou tout objet) ...
Une solution que je vois est, sauf erreur de ma part, d'implémenter une classe permettant de gérer ce tableau et en particulier des méthodes d'accès à celui-ci (allocation, destruction, ajouts/retraits d'éléments, nombre d'éléments, taille, etc.). En résumé cela revient à encapsuler un simple tableau dans un objet ce qui peut sembler compliqué mais c'est malheureusement le prix à payer avec la POO ;-).
Le pointeur sur le tableau disparait alors au profit d'un pointeur sur cette classe ce qui en soit n'est pas plus compliqué pour son utilisation...
cf. à l'occasion Les chaînes de caractères : std::string bien que je pense que tu maîtrises le sujet.
Cordialement, A+
--
Claudius
Dernière modification par claudius01 (Le 01/08/2014, à 19:08)
Hors ligne
#3 Le 02/08/2014, à 11:13
- moi4567
Re : [C++] Taille d'un tableau par un pointeur.
Salut
Donc pas moyen de trouver la taille a partir du pointer. Je pense opter pour la solution de mettre la taille du tableau dans la premiere cellule du tableau (tableau [0]). Ca represente pas plus de travail que de le mettre dans une classe. Il faudra simplement que je fasse attention a ne pas confondre les tableaux avec compteur et sans compteur... Étant donne que le programme que je fait la n'est pas tres complexe je pense pouvoir me le permettre mais c'est sur que je ne le ferrais pas a chaque fois. Tous depend du programme mais c'est sur que de mettre le compteur dans une classe a l'air plus sûr.
En tous cas merci beaucoup, j'ai trouve ce que je cherchais
Dernière modification par moi4567 (Le 02/08/2014, à 11:15)
Hors ligne
#4 Le 02/08/2014, à 11:51
- no_spleen
Re : [C++] Taille d'un tableau par un pointeur.
Bonjour,
Difficle de donner une réponse précise sans plus de détails sur ton code, mais est-ce que tu ne peux pas remplacer ton tableau par un std::vector < std::string > , ou un std::vector < std::vector < std::string > > ? std::vector possède en effet une fonction size() qui te permet de connaitre la taille de ton vecteur.
Hors ligne
#5 Le 02/08/2014, à 12:40
- Braun
Re : [C++] Taille d'un tableau par un pointeur.
Bonjour,
Je pense opter pour la solution de mettre la taille du tableau dans la premiere cellule du tableau (tableau [0]).
Pourquoi pas définir une petite structure contenant l'adresse du tableau et sa taille ?
Hors ligne
#6 Le 02/08/2014, à 14:11
- Destroyers
Re : [C++] Taille d'un tableau par un pointeur.
sizeof(*tableau)
ne donnerait rien ?
Hors ligne
#7 Le 03/08/2014, à 18:44
- moi4567
Re : [C++] Taille d'un tableau par un pointeur.
Bonjour,
Difficle de donner une réponse précise sans plus de détails sur ton code, mais est-ce que tu ne peux pas remplacer ton tableau par un std::vector < std::string > , ou un std::vector < std::vector < std::string > > ? std::vector possède en effet une fonction size() qui te permet de connaitre la taille de ton vecteur.
Bonne idée, je suis en train de tester ça, j'ai quelques problèmes mais je vais les régler
Bonjour,
moi4567 a écrit :Je pense opter pour la solution de mettre la taille du tableau dans la premiere cellule du tableau (tableau [0]).
Pourquoi pas définir une petite structure contenant l'adresse du tableau et sa taille ?
Dans le cas précis dans lequel je suis ça me parais moins prise de tête de mettre le compteur au début du tableau plutôt que de créer une structure exprès pour ça. En revanche, dans d'autres cas la création d'une classe me parais plus adapté. Après c'est une question de point de vu et de gout je suppose
sizeof(*tableau)
ne donnerait rien ?
Cette fonction me renvois la taille du pointeur
Je vais tester la solution de no_sleep, ça m'a l'air d'être le plus simple. J'ai quelques petits problèmes pour le moment car j'ai un autre vector dans la fonction donc ça me créer quelques soucis mais je vous dit dès que c'est bon
En tous cas merci à vous tous
Hors ligne
#8 Le 04/08/2014, à 21:43
- alius
Re : [C++] Taille d'un tableau par un pointeur.
un tableau en c++ n'est rien d'autre qu'un pointeur constant
sizeof(*tableau)
est équivalent à
sizeof(tableau[0])
le probleme c'est que tu utilises des objets dont la taille peut varier ici des string
il n'est donc pas possible d'utiliser ce genre de notation pour connaitre la taille d'un tableau d'entier par exemple
int taille = sizeof(tableau)/sizeof(int);
Dernière modification par alius (Le 04/08/2014, à 21:44)
Alius
Hors ligne
#9 Le 04/08/2014, à 23:12
- pires57
Re : [C++] Taille d'un tableau par un pointeur.
Bonjour,
Difficle de donner une réponse précise sans plus de détails sur ton code, mais est-ce que tu ne peux pas remplacer ton tableau par un std::vector < std::string > , ou un std::vector < std::vector < std::string > > ? std::vector possède en effet une fonction size() qui te permet de connaitre la taille de ton vecteur.
A titre perso j'ai une préférence pour les hashmap qui compte également tout un tas de jolie fonction
Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn
Hors ligne
#10 Le 05/08/2014, à 19:39
- alius
Re : [C++] Taille d'un tableau par un pointeur.
Bonjour,
Difficle de donner une réponse précise sans plus de détails sur ton code, mais est-ce que tu ne peux pas remplacer ton tableau par un std::vector < std::string > , ou un std::vector < std::vector < std::string > > ? std::vector possède en effet une fonction size() qui te permet de connaitre la taille de ton vecteur.
A titre perso j'ai une préférence pour les hashmap qui compte également tout un tas de jolie fonction
salut
on ne choisi pas d'utiliser une hashmap ou un vector par préférence mais pour l'utilisation que l'on souhaite en faire. Le premier est un conteneur de type associatif, l'autre de type séquentiel.
Alius
Hors ligne
#11 Le 18/08/2014, à 11:09
- Luc Hermitte
Re : [C++] Taille d'un tableau par un pointeur.
Hello.
Ne JAMAIS utiliser la notation avec sizeof(jespere_un_tableau)/sizeof(jespere_un_tableau[0]) en C++ -- en C, il n'y a pas le choix, c'est une autre histoire. Grâce aux templates, il y a moyen d'obtenir l'information sur les tableaux et de recevoir un message d'erreur sur les pointeurs -- ce que ne permet donc pas le C.
Je déterre un bon vieux code pour l'histoire : http://hermitte.free.fr/Info/C++/libs/l … p.hpp.html En C++11, on pourra tout "simplement" utiliser std::extend<decltype(jespere_un_tableau)>::value qui est fait pour ça -- OK, la syntaxe est pourrie, c'est pour ça que j'ai un snippet pour vim qui se charge de s'en souvenir pour moi ^^'
Sinon, si tu te retrouves à recevoir un pointeur, tu ne pourras rien faire à part faire circuler la taille via un autre chemin -- quitte à rendre la fonction template (cf le lien précédant pour la syntaxe) si tu cherches à faire circuler un tableaux statiques (BTW, std::array<> du C++11 c'est bien aussi). Mais ... si tu fais du C++ (et pas du C), je ne peux te conseiller vivement d'éviter les pointeurs bruts/nus, et d'utiliser la bibliothèque standard ici. Hormis les problèmes de gestion des durées de vies (on ne peut plus difficile/impossible à gérer correctement en présence d'exceptions), tu viens de rencontrer un autre problème, celui des conversions implicites des tableaux vers des pointeurs.
EDIT: Et à moins d'un exercice pour un prof qui ne vous a pas appris le C++ tel qu'il devrait être utilisé (i.e. il ne vous a pas montré std::vector<>), ne t'amuse pas à réinventer la roue pour autre chose que l'exercice de savoir comment elle est faite. I.e. si ton objectif est d'écrire un programme qui gère des ensembles de choses (même si c'est un exo), alors utilises std::vector<> ; si ton objectif est de voir comment un vecteur ça marche dedans, alors fais cet exo et nul autre, il est déjà suffisamment riche par lui-même)
Dernière modification par Luc Hermitte (Le 18/08/2014, à 11:17)
Hors ligne