Pages: [1]   Go Down
Author Topic: Tableau bidimensionnel et sizeof()?  (Read 1295 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
« Last Edit: September 04, 2011, 09:59:26 am by schizophrene » Logged

Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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?
Logged

Made in Belgium
Offline Offline
God Member
*****
Karma: 0
Posts: 756
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

}
« Last Edit: September 04, 2011, 01:44:35 pm by osaka » Logged


Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:
#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
« Last Edit: September 07, 2011, 01:45:15 am by SesechXP » Logged


Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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 smiley

EDIT²: Ce qui est dommage, c'est qu'il faut définir la taille du tableau lors de son initialisation.
« Last Edit: September 06, 2011, 12:52:44 pm by schizophrene » Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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 :
Code:
int tableau[] = { 0, 1, 2, 3 };

- par contre pour un tableau à deux dimensions il faut initialiser au moins la seconde dimension :
Code:
int tableau[][2] =
{
    {0, 1},
    {2, 3}
};
« Last Edit: September 07, 2011, 06:51:04 am by SesechXP » Logged


Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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().
Logged

Offline Offline
Full Member
***
Karma: 0
Posts: 224
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Dans un exemple tout bête je parviens sans problème à utiliser sizeof :
Code:
#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 smiley-sweat
Logged


Offline Offline
Sr. Member
****
Karma: 2
Posts: 259
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

Pages: [1]   Go Up
Jump to: