3 votes

Comment obtenir une colonne d'un tableau multidimensionnel en C/C++?

int matrix[9][9],*p;
p=matrix[0]; 

cela fonctionne et donne la première ligne de la matrix, mais comment obtenir la première colonne de la matrix J'ai essayé p=matrix[][0]; ? De plus, je ne comprends pas pourquoi le code ci-dessous obtient une erreur de compilation ?

int matrix[9][9],p[9];  // ça a l'air vraiment moche, mais pourquoi ça ne marche pas ?
p=matrix[0];            // le compilateur donne "affectation de tableau invalide"

est-ce que c'est parce que les tableaux multidimensionnels sont des tableaux de tableaux - et nous devrions interpréter matrix[i][j] comme le j-ème élément du i-ème tableau imbriqué ?

1voto

TnT Points 11

Voici un programme qui construit un tableau 10x10 et imprime la deuxième colonne :

#include 

using namespace std;

int main()
{
   int aa[10][10];

   for(int i = 0; i<10; i++)
       for(int j = 0; j<10; j++)
           aa[i][j] = i*10+j;

   int col = 2;

   // pointeur vers un tableau 1D de taille 10
   int (*p)[10] = (int (*)[10])&(aa[0][col]);

   for(int i = 0; i<10; i++)
      cout << *(p[i]) << endl;

   return 0;
}

La différence par rapport à aa[row][2] est l'utilisation d'un pointeur vers un tableau 1D de taille 10 int (*p)[10]. Pour plus de contexte sur int (*p)[10], voir cette réponse

p enregistre l'adresse du tableau 1D {2, 3, 4, 5, 6, 7, 8, 9, 10, 11}. Et p+1 enregistre l'adresse du tableau 1D {12, 13, 14, 15, 16, 17, 18, 19, 20, 21}. *(p[1]) ou *(*(p+1)) accède à la première valeur du tableau 1D.

0voto

Thomas Matthews Points 19838

Si vous voulez que votre matrice se trouve dans des emplacements contigus, déclarez-la comme un tableau unidimensionnel et effectuez les calculs de lignes et de colonnes vous-même :

int contiguous_matrix[81];

int& location(int row, int column)
{
  return contiguous_matrix[row * 9 + column];
}

Vous pouvez également itérer sur chaque colonne d'une ligne :

typedef void (*Function_Pointer)(int&);

void Column_Iteration(Function_Pointer p_func, int row)
{
  row = row * MAXIMUM_COLUMNS;
  for (unsigned int column = 0; column < 9; ++column)
  {
    p_func(contiguous_matrix[row + column]);
  }
}

0voto

Georgi Points 1

Pour les tableaux déclarés statiquement, vous pouvez y accéder comme un tableau 1D continu, p = matrix[0] vous donnera la 1ère colonne de la 1ère ligne. Ensuite, le tableau 1D peut être accédé comme p[i], *(p+i), ou p[current_raw * raw_size + current_column).

Les choses se compliquent si un tableau 2D est représenté avec **p car il sera interprété comme un tableau de pointeurs vers des tableaux 1D.

0voto

Aarat Chopra Points 17

Je ne sais pas si c'est une solution efficace mais en procédant de cette manière, je suis en mesure d'obtenir la colonne,

int arr[9][2] = { {2,  57}, {3,  66}, {4,  73}, {5,  76}, {6,  79}, {7,  81}, {8,  90}, {9,  96}, {10, 100}};

int c[18];
int co = 0;
for (auto & i : arr) {
    for (int j : i) {
        c[co++] = j;
    }
}

for (int i = 0; i < co; ++i) {
    if (i % 2 != 0)
        std::cout << c[i] << " ";
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X