Tableau bidimensionnel et sizeof()?

Bonjour à tous,

Je cherche à utiliser sizeof() avec un tableau à 2 dimensions tableau[y][z]. Le but serait d'obtenir la taille y et la taille z, que je ne connais pas (le tableau peut-être soumis à des changements de taille dans chaque dimension).

Auriez-vous une idée à me proposer?

D'avance, merci

Bon, je me réponds à moi-même :slight_smile:

J'ai utilisé sizeof(tableau) pour obtenir z. J'ai utilisé en test un tableau de 16*15 éléments. Le résultat (obtenu avec Serial.begin) valait 480, que j'ai divisé par 30 pour obtenir 16.
J'ai ensuite doublé le tableau afin de tester: 960/30 = 32.

Pour y, sizeof(tableau[0]). Dans le premier cas, j'ai obtenu 30, que j'ai divisé par 2 pour obtenir 15.
Dans le deuxième cas (tableau doublé), j'avais toujours 30/2 = 15.

Je suis tout bon!
Par contre, je ne trouve pas la méthode très catholique. Quelqu'un a mieux à me proposer?

sizeof retourne le nombre de byte contenu dans la variable donc si tu utilise un int par exemple une case de ton tableau vaudra 2 puisque un int vaut 2 byte.

tu peux tester sizeof(char), sizeof(int), sizeof(long), etc, donc tu dois divisé également par le nombre de byte inclus dans le type défini.

exemple

int tab[16][15];

void setup()
{
  Serial.begin(9600);

  int z = sizeof(tab)/(sizeof(int)*(sizeof(tab[0])/sizeof(int)));
  int y = sizeof(tab[0])/sizeof(int);
  
  Serial.print("z=");
  Serial.println(z);
  
  Serial.print("y=");
  Serial.println(y);
}

void loop()
{

}

Salut,

C'est un problème courant, autant faire quelque chose de réutilisable... En restant dans l'esprit de ce que propose Osaka, tu peux utiliser des macros :

#define ROW_COUNT(array)    (sizeof(array) / sizeof(*array))
#define COLUMN_COUNT(array) (sizeof(array) / (sizeof(**array) * ROW_COUNT(array)))

int tableau[16][64];

void setup(){
int y = ROW_COUNT(tableau);
int z = COLUMN_COUNT(tableau);

// [...]
}

Ainsi le calcul sera toujours valable même si tu changes le type de ton tableau.

++

Edit : correction macro COLUMN_COUNT

Merci beaucoup pour ces infos, je m'en va tester ça de ce pas :slight_smile:

EDIT: Bon, j'ai modifié mon code, mais je n'aurais le temps de le tester que demain. Si c'est bon, je mets en résolu :slight_smile:

EDIT²: Ce qui est dommage, c'est qu'il faut définir la taille du tableau lors de son initialisation.

schizophrene:
EDIT²: Ce qui est dommage, c'est qu'il faut définir la taille du tableau lors de son initialisation.

Pas complètement :

  • pour un tableau à une dimension, tu peux écrire :
int tableau[] = { 0, 1, 2, 3 };
  • par contre pour un tableau à deux dimensions il faut initialiser au moins la seconde dimension :
int tableau[][2] =
{
    {0, 1},
    {2, 3}
};

Je n'y arrive pas avec sizeof(), j'obtiens un message d'erreur (comme quoi j'entre un tableau dont un paramètre manque, je ne l'ai plus en tête).

En fait je suis obligé actuellement de renseigner la taille des 2 dimensions dans mon .h, mais pas dans mon .cpp pour pouvoir utiliser sizeof().

Dans un exemple tout bête je parviens sans problème à utiliser sizeof :

#define ROW_COUNT(array)    (sizeof(array) / sizeof(*array))
#define COLUMN_COUNT(array) (sizeof(array) / (sizeof(**array) * ROW_COUNT(array)))

int tableau[][2] =
{
    {0, 1},
    {2, 3}
};

void setup(){
int y = ROW_COUNT(tableau);
int z = COLUMN_COUNT(tableau);

// [...]
}

Le problème vient probablement du fait que la déclaration et la définition du tableau sont séparées. Tu peux poster le bout de code en question ?

PS : j'ai corrigé la macro COLUMN_COUNT qui était foireuse :sweat_smile:

Hello!

J'ai rapidement testé les macros, ça fonctionne parfaitement, merci.

Concernant mon erreur par rapport au tableau, je posterai mon code demain.
Et si on ne trouve pas de solution, je pense que une fois la taille du tableau bien définie, ce ne sera plus un problème.