CONAITRE LA TAILLE D'UN TABLEAU SANS STRING.H

Signaler
-
Messages postés
3
Date d'inscription
mercredi 2 juillet 2003
Statut
Membre
Dernière intervention
11 juillet 2003
-
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

Messages postés
3
Date d'inscription
mercredi 2 juillet 2003
Statut
Membre
Dernière intervention
11 juillet 2003

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";)
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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.
Messages postés
23
Date d'inscription
mercredi 16 juillet 2003
Statut
Membre
Dernière intervention
28 mars 2013

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. :-(
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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.
Messages postés
23
Date d'inscription
mercredi 16 juillet 2003
Statut
Membre
Dernière intervention
28 mars 2013

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.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
27
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.
Messages postés
23
Date d'inscription
mercredi 16 juillet 2003
Statut
Membre
Dernière intervention
28 mars 2013

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;

:)