Go Down

Topic: Tableau bidimensionnel et sizeof()? (Read 1 time) previous topic - next topic

schizophrene

Sep 04, 2011, 04:39 pm Last Edit: Sep 04, 2011, 04:59 pm by schizophrene Reason: 1
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

schizophrene

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

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?

osaka

#2
Sep 04, 2011, 07:43 pm Last Edit: Sep 04, 2011, 08:44 pm by osaka Reason: 1
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

Code: [Select]

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()
{

}

SesechXP

#3
Sep 05, 2011, 10:57 am Last Edit: Sep 07, 2011, 08:45 am by SesechXP Reason: 1
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 :
Code: [Select]

#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

schizophrene

#4
Sep 06, 2011, 07:26 pm Last Edit: Sep 06, 2011, 07:52 pm by schizophrene Reason: 1
Merci beaucoup pour ces infos, je m'en va tester ça de ce pas :)

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 :)

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

Go Up