Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 31/07/2014, à 21:36

moi4567

[C++] Taille d'un tableau par un pointeur.

Bonjour à tous smile

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 hmm.

J'ai toujours la solution de rendre mon tableau global mais j'aimerais vraiment éviter ça.

Merci d'avance smile

Hors ligne

#2 Le 01/08/2014, à 16:40

claudius01

Re : [C++] Taille d'un tableau par un pointeur.

Bonjour,

moi4567 a écrit :

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 smile

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 smile

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,

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 ?

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.

no_sleep a écrit :

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 smile

Braun a écrit :

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 smile

Destroyers a écrit :
sizeof(*tableau)

ne donnerait rien ?

Cette fonction me renvois la taille du pointeur hmm


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 smile
En tous cas merci à vous tous wink

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.

pires57 a écrit :

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