CONAITRE LA TAILLE D'UN TABLEAU SANS STRING.H

TotalRecall - 28 juil. 2001 à 16:25
avramb Messages postés 3 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 11 juillet 2003 - 18 oct. 2006 à 16:05
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/9207-conaitre-la-taille-d-un-tableau-sans-string-h

avramb Messages postés 3 Date d'inscription mercredi 2 juillet 2003 Statut Membre Dernière intervention 11 juillet 2003
18 oct. 2006 à 16:05
ouais je suis pas du genre à me moquer, mais la ca frise le ridicule, dsl. surtt qd je lis "LA solution", et qu'il en est fier le gars.
strlen fais un peu plus que ca qd meme, elle cherche le charactere de fin d'une chaine de characteres '\0'. on utilise strlen en general pr ce genre de truc :

int func(char*chaine) return ta_fonction(chaine);

(par exemple avec : char*chaine="essais";)
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
10 févr. 2005 à 00:24
ta classe Tableau devrait avoir un membre:
DWORD count;
que le constructeur standard met à 0.
Fais aussi un autre constructeur qui prend (int *tab, DWORD n) et voilà tout.
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
9 févr. 2005 à 18:41
J'ai regardé attentivement tes sources , notamment Tableau à deux dimensions , Tableau de chaines.
Finalement j'en suis toujours au même point.

J'aimerai pourvoir faire :
Tableau t({1,2,3});
t.afficher(); // affiche 1 2 3
mais pour cela , il faudrait mettre int tb[]; dans la classe Tableau , ce qui n'est pas possible en c/c++ ...

En java , ça va :
class Tableau
{
int tb[];
Tableau(int t[])
{
tb = new int[t.length];
...
}
...
}

Il y a donc surement un moyen de la faire en cpp. Car avec java c'est un peu lent et il y a pas les surcharges d'opérateurs. :-(
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
9 févr. 2005 à 11:02
int i[10];
est immuable, ne peut pas etre réduit ni allongé.

n'a absolument RIEN A VOIR avec un pointeur car on peut le faire pointer où l'on veut à nimporte quel moment, voila pourquoi sizeof ne peut donner que la taille du pointeur sans pouvoir presumer de l'endroit où il pointe à tel moment.

Pour ta classe Tableau, regarde dans les sources et repose ta question sur le forum.
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
9 févr. 2005 à 00:40
D'accord BruNews mais il me semblait que l'espace mémoire était alloué au moment du i = new int[10]; . A la fac , on m'avait expliqué que int i[10]; (allocation statique car tout de suite alloué) était equivalent à int i*;//code;i=new int[10]; (allocation dynamique car on peut alloué la mémoire plus tard) . T'es d'accord avec ça ?

Il est vrai que j'obtiens le même résultat avec n'importe quel type de pointeur . Mais alors , comment faire ma classe Tableau ?

class Tableau
{
int *tb;
Tableau(int *t)
{
tb = new int[sizeof(t)/sizeof(int)];
...
}
...
}

Il doit bien avoir une astuce (peut-être pas forcément avec un pointeur) pour obtenir cette classe.
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
8 févr. 2005 à 23:19
int i[10];
est un tableau dont la taille est connue lors de sa declaration, sizeof donnera bien la taille totale de ses elements.

int *i;
est un pointeur, le compilo ne présumera rien sur ce qu'il pointera, sizeof de TOUT pointeur sur platform 32 bits donnera toujours 4, donc divise 4 donne bien 1, rien que du normal.
thristam Messages postés 23 Date d'inscription mercredi 16 juillet 2003 Statut Membre Dernière intervention 28 mars 2013
8 févr. 2005 à 23:01
salut obasileus,

J'ai pensé aussi à faire ça . Mais j'ai eu une suprise quand j'ai voulu le faire sur un pointeur.

En allocation statique , pas de problème :
int i[10];
cout<<sizeof(i)/sizeof(int); // affiche 10

Mais si on fait en allocation dynamique , suprise ! :
int *i;
i new int[10]; // pareil avec i (int*)malloc(sizeof(int)*10);
cout<<sizeof(i)/sizeof(int); // affiche 1 !!!!!

J'ai obtenu ce résultat avec devcpp. Je suis obligé de passer par un pointeur pour faire une classe Tableau.

Alors qu'en penses-tu ?
merci qui ?
Merci I.Horton oui ;)
ouais ben t pas le premier à y avoir pensé :)

int i[10];
cout << "Taille du tableau : " << sizeof(i) / sizeof(int) << endl;

:)
Rejoignez-nous