web-dev-qa-db-fra.com

C: Taille d'un tableau à deux dimensions

J'ai besoin d'aide pour compter les lignes et les colonnes d'un tableau à deux dimensions. Il semble que je ne peux pas compter les colonnes?

#include <stdio.h>

int main() {

char result[10][7] = {

    {'1','X','2','X','2','1','1'},
    {'X','1','1','2','2','1','1'},
    {'X','1','1','2','2','1','1'},
    {'1','X','2','X','2','2','2'},
    {'1','X','1','X','1','X','2'},
    {'1','X','2','X','2','1','1'},
    {'1','X','2','2','1','X','1'},
    {'1','X','2','X','2','1','X'},
    {'1','1','1','X','2','2','1'},
    {'1','X','2','X','2','1','1'}

};

int row = sizeof(result) / sizeof(result[0]);
int column = sizeof(result[0])/row;

printf("Number of rows: %d\n", row);
printf("Number of columns: %d\n", column);

}

Sortie:
Nombre de rangs: 10
Nombre de colonnes: 0

11
Wickerman

C'est un problème de division entière!

int column = sizeof(result[0])/row;

devrait être

int column = 7 / 10;

et en division entière, 7/10==0.

Ce que vous voulez faire, c'est diviser la longueur d'une ligne, par exemple. sizeof(result[0]) par la taille d'un élément de cette ligne, par exemple. sizeof(result[0][0]):

int column = sizeof(result[0])/sizeof(result[0][0]);
7
Marcus Müller

Il est beaucoup plus pratique (et moins sujet aux erreurs) d'utiliser une macro de longueur de tableau:

#include <stdio.h>

#define LEN(arr) ((int) (sizeof (arr) / sizeof (arr)[0]))

int main(void)
{
    char result[10][7];

    printf("Number of rows: %d\n", LEN(result));
    printf("Number of columns: %d\n", LEN(result[0]));
    return 0;
}
9
August Karlstrom

Cela fonctionne pour moi (commentaires explique pourquoi):

#include <stdio.h>

int main() {

   char result[10][7] = {

       {'1','X','2','X','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'1','X','2','X','2','2','2'},
       {'1','X','1','X','1','X','2'},
       {'1','X','2','X','2','1','1'},
       {'1','X','2','2','1','X','1'},
       {'1','X','2','X','2','1','X'},
       {'1','1','1','X','2','2','1'},
       {'1','X','2','X','2','1','1'}

   }; 

   // 'total' will be 70 = 10 * 7
   int total = sizeof(result);

   // 'column' will be 7 = size of first row
   int column = sizeof(result[0]);

   // 'row' will be 10 = 70 / 7
   int row = total / column;

   printf("Total fields: %d\n", total);
   printf("Number of rows: %d\n", row);
   printf("Number of columns: %d\n", column);

}

Et la sortie de ceci est:

Total of fields: 70
Number of rows: 10
Number of columns: 7

MODIFIER:

Comme indiqué par @AnorZaken, passer le tableau à une fonction en tant que paramètre et y imprimer le résultat de sizeof donnera une autre total. En effet, lorsque vous transmettez un tableau en argument (et non un pointeur sur celui-ci), C le transmettra en tant que copie et lui appliquera une certaine magie, de sorte que vous ne transmettez pas exactement la même chose que vous le pensez. Pour être sûr de ce que vous faites et pour éviter un surcroît de travail du processeur et de consommation de mémoire, il est préférable de passer des tableaux et des objets par référence (à l'aide de pointeurs). Donc, vous pouvez utiliser quelque chose comme ça, avec les mêmes résultats que l'original:

#include <stdio.h>

void foo(char (*result)[10][7])
{
   // 'total' will be 70 = 10 * 7
   int total = sizeof(*result);

   // 'column' will be 7 = size of first row
   int column = sizeof((*result)[0]);

   // 'row' will be 10 = 70 / 7
   int row = total / column;

   printf("Total fields: %d\n", total);
   printf("Number of rows: %d\n", row);
   printf("Number of columns: %d\n", column);

}

int main(void) {

   char result[10][7] = {

       {'1','X','2','X','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'X','1','1','2','2','1','1'},
       {'1','X','2','X','2','2','2'},
       {'1','X','1','X','1','X','2'},
       {'1','X','2','X','2','1','1'},
       {'1','X','2','2','1','X','1'},
       {'1','X','2','X','2','1','X'},
       {'1','1','1','X','2','2','1'},
       {'1','X','2','X','2','1','1'}

   };

   foo(&result);

   return 0;
}
7
emi
    // gets you the total size of the 2d array 
    printf("Arrays Total size: %ld\n",sizeof(result));

    // gets you the cumulative size of row which is 5 columns * sizeof(int)
    printf("1 row cumulative size: %ld\n",sizeof(result[0]));

    // division of total array size with cumulative size of row gets you total number of rows
    printf("total number of rows: %ld\n",sizeof(result)/sizeof(result[0]));

    // and total number of columns you get by dividing cumulative row size with sizeof(char)
    printf("total number of columns: %ld\n",sizeof(result[0])/sizeof(char));
0
mfaisal