Les tableaux

:pt1cable:

la taille de int tab[12];

non.

vous voulez la soluce ou je vous laisse chercher ?

hmmm j’arrive juste a faire ca … sous devc++
ce qui te donne la taille ‘affectée’ du tableau mais pas la taille totale …

[cpp]
#include <iostream.h>
#include <stdlib.h>

int taille(int *toto){
return (*toto==NULL)?0: 1 + taille(++toto);
}

int main()
{

int tab[10]={1,2,3,4,5};
cout << “\nTaille du tableau :” <<taille(tab)<<endl;
system(“PAUSE”);

}
[/cpp]

en y réfléchissant jme demande …
en c++ un tableau est un pointeur …
donc tu passes forcémentun pointeur contrairement à ce que t’as dit avant …
en passant le pointeur tu fais une copie locale …pour retrouver lvraie addresse ici il faufrait utiliser &(*toto)) dans la fonction ou bien passer (int)&tab à la fonction … mais dans tout les cas les adresses existeront dans la RAM et seraont allouée d’une facon ou d’une autre avec des entiers de folie …
ici je ne vois pas comment identifier que l’on a atteint la fin de la zone mémoire allouée statiquement …

un tableau != pointeur

il s’avère qu’en C/C++
int tab[3];
tab correspond à l’adresse de tab[0] mais un tableau n’est pas un pointeur.

PS : en C++
#include
// pas besoin de stdlib

pr stdlib c pour system …
bah euh le nom d’un tableau est bien un pointeur sur le premier élément du tableau quoi !

tu m’as retourné le cerveau là …
moi je donne ma langue au chat … (j’ai honte)

tab est bien le pointeur sur le premier élément du tableau mais tab n’est pas le tableau.

oui oui autant pour moi tu as raison

[cpp]
#include
#include // for size_t

template<typename T, size_t N>
inline size_t size(const T (&)[N])
{
return N;
}

int main()
{
int tab[12];
std::cout << size(tab) << “\n”;
}
[/cpp]

PS: merci à TAZ pour son défi et sa réponse :slight_smile:

tricheur :stuck_out_tongue:
tu utilises une lib !!

:stuck_out_tongue:

me souviens plus de l’utilité des templates [:______]

pas condu tout j’avais oublié que tu pouvais préciser une taille dans les templates !

Sympas l’enigme !

sans la bibliothèque ca marche tres bien sans mais c’est pas propre.

un template permet de faire des fonctions générique qui sont instancié à la compil et donc ici on appel size avec tab
et le compilo sait que N = 12 et donc crée un fonction :

size_t size(const int (&)[12])
{
return 12;
}

:stuck_out_tongue:

Tin fallais utiliser les templates ! Je les ai pas souvent utilisées alors j’aurais pas pu trouvé.
:clap:

:ouch: tu parles d’une méthode :sarcastic:

:??: :??:
pour faire un calcul à l’execution alors qu’on peut connaitre la valeur à la compilation …

bah tu peux pas réutiliser cette taille dans du code aussi [:______]

bien sur que si.
depuis quand une fonction n’est utilisable qu’une seule fois.
Cependant comme je l’ai dis elle ne marche que pour les tableaux et non les vecteurs.

Réfléchissement Jean Pierre…

Prenons la déclaration du tableau suivant:

int tableau[10];// déclare un tableau de int soit (2 octets pour un int) (4 pour un long etc…)

En supposant qu’on utilise l’espace de nom std, il faut inclure la directive suivante dans l’en tête:
using namespace std;

Dans le corps du programme, on peut faire ca :

int Taille; // declacre une variable de type entier pour stocker le résultat

Taille= sizeof tableau/sizeof tableau[0];//divise la taille du tableau par la taille du premier index

Au final on a ça, si on a bien suivi:

code :

#include
using namespace std;

int main()
{
int tableau[10];
int Taille;
Taille = sizeof tableau/sizeof tableau[0];
cout <<“la taille du tableau est de : " <<Taille <<” octets."<<endl;
return 0;
}

si on le compile, ca marche :wink: