web-dev-qa-db-fra.com

Initialisation de tableau multidimensionnel

J'ai vu une question dans l'examen C++ aujourd'hui:

Étant donné le tableaint Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2}, quelle est la valeur deMulti[1][1][0]?

Les tableaux tridimensionnels ne devraient-ils pas être initialisés comme ceci: {{{},{}},{{},{}},{{},{}}}? Comment puis-je trouver la valeur de l'élément avec de tels indéces? C'est tellement déroutant.

45
user4920379

Vous pouvez initialiser les tableaux de deux manières, bien que l'utilisation d'accolades intérieures bouclées soit recommandée car elle améliore la lisibilité.

La façon la plus simple de trouver la valeur d'un élément d'un tableau multidimensionnel non formaté avec des accolades est de diviser le tableau. Par exemple, les dimensions de votre baie sont 2x3x2:

Divisez d'abord le tableau en 2 ensembles (2 x3x2)

{14,11,13,10,9,6,8,7,1,5,4,2} --> {{14,11,13,10,9,6}, {8,7,1,5,4,2}}

Ensuite, divisez chaque ensemble en ensembles (2x x2)

{{14,11,13,10,9,6},{8,7,1,5,4,2}} --> {{{14,11}, {13,10} ,{9,6}}, {{8,7}, {1,5}, {4,2}}}

Maintenant, comme vous le voyez, il y a 2 éléments dans chaque ensemble plus petit (2x3x 2), vous avez donc formaté votre tableau avec des accolades.

Maintenant, il est plus simple de trouver la valeur de l'élément avec l'indice de [1][1][0]. Cet élément est le 2ème ([1] [1] [0]) 2ème plus grand ensemble ([1] [1] [0]) le 1er plus petit ([1] ] [1] []), donc la réponse est 1.


Cela étant dit, une telle question d'examen montre le manque de professionnalisme de votre professeur, qui est plus intéressé à abuser de la syntaxe du langage de programmation plutôt qu'à enseigner les règles fondamentales d'initialisation.

63
gdrt

La bonne réponse qui devrait donner un score complet serait: compiler du code avec tous les avertissements activés et vous ne finirez pas par écrire du code merdique comme celui-ci.

gcc test.c -std=c11 -pedantic-errors -Wall -Wextra
test.c: In function 'main':
test.c:6:3: warning: missing braces around initializer [-Wmissing-braces]
   int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2};
   ^

Cependant, je soupçonne que votre professeur n'est pas tellement préoccupé par le code étant merde, mais cherche plutôt les détails dans le langage C qui permet aux tableaux (et structures) d'être initialisés même si la liste d'accolades ne correspond pas à la structure de ce qui est initialisé.

En ce qui concerne le langage C, int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2} est complètement équivalent à:

// properly written initialization list for a 3D array
int Multi[2][3][2] = 
{ 
  {
    {14, 11},
    {13, 10},
    { 9,  6}
  },
  {
    { 8,  7},
    { 1,  5},
    { 4,  2}
  }
};

niquement raison pour laquelle le premier formulaire est autorisé, c'est parce qu'il vous permet d'écrire des choses comme

int Multi[2][3][2] = {0};

qui initialise explicitement le premier élément à 0 et le reste des éléments comme s'ils avaient une durée de stockage statique (0 également). Cela signifie que tous les éléments seront mis à zéro.

Écrire des choses comme int Multi[2][3][2] = {14,11,13,10,9,6,8,7,1,5,4,2} abuse du langage C. C'est une très mauvaise pratique. Cela est interdit par MISRA-C et ainsi de suite.

Un bon professeur se soucierait de vous enseigner comment activer tous les avertissements du compilateur et comment initialiser correctement les tableaux multidimensionnels, plutôt que de vous laisser interpréter du code non-sens obscurci.

24
Lundin

int Multi [2] [3] [2] = {14,11,13,10,9,6,8,7,1,5,4,2};

la carte mémoire de Multi [2] [3] [2] est->

Multi [0] [0] [0] = 14;

Multi [0] [0] [1] = 11;

Multi [0] [1] [0] = 13;

Multi [0] [1] [1] = 10;

Multi [0] [2] [0] = 9;

Multi [0] [2] [1] = 6;

Multi [1] [0] [0] = 8;

Multi [1] [0] [1] = 7;

Multi [1] [1] [0] = 1;

Multi [1] [1] [1] = 5;

Multi [1] [2] [0] = 42;

Multi [1] [2] [1] = 2;

donc la valeur de Multi [1] [1] [0] = 1; c'est si simple

et on peut aussi initialiser comme ça

int Multi [2] [3] [2] = {{{14,11}, {13,10}, {9,6}}, {{8,7}, {1,5}, {4,2 }}};

2