Comment retourner un tableau en 2D à partir d'une fonction en C++

Jinku Hu 12 octobre 2023
  1. Utiliser la notation par pointeur pour retourner un tableau 2D à partir d’une fonction en C++
  2. Utiliser la notation pointeur pour pointeur pour retourner un tableau 2D à partir d’une fonction en C++
Comment retourner un tableau en 2D à partir d'une fonction en C++

Cet article présente la façon de retourner un tableau 2D à partir d’une fonction en C++.

Utiliser la notation par pointeur pour retourner un tableau 2D à partir d’une fonction en C++

Le retour par le pointeur est la méthode préférée pour les objets plus grands plutôt que de les retourner par valeur. Comme le tableau 2D peut devenir assez grand, il est préférable de passer le pointeur au premier élément de la matrice, comme le montre l’exemple de code suivant. Notez que le paramètre pour le tableau 2D dans ModifyArr est défini avec la notation arr[][SIZE] pour accéder à ses éléments avec des crochets dans la portée de la fonction.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;

constexpr int SIZE = 4;

int *ModifyArr(int arr[][SIZE], int len) {
  for (int i = 0; i < len; ++i) {
    for (int j = 0; j < len; ++j) {
      arr[i][j] *= 2;
    }
  }
  return reinterpret_cast<int *>(arr);
}

int main() {
  int c_array[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

  cout << "input array\n";
  for (auto &i : c_array) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  int *ptr = ModifyArr(c_array, SIZE);

  cout << "modified array\n";
  for (int i = 0; i < SIZE; ++i) {
    cout << " [ ";
    for (int j = 0; j < SIZE; ++j) {
      cout << setw(2) << *(ptr + (i * SIZE) + j) << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

input array
 [  1,  2,  3,  4, ]
 [  5,  6,  7,  8, ]
 [  9, 10, 11, 12, ]
 [ 13, 14, 15, 16, ]

modified array
 [  2,  4,  6,  8, ]
 [ 10, 12, 14, 16, ]
 [ 18, 20, 22, 24, ]
 [ 26, 28, 30, 32, ]

Utiliser la notation pointeur pour pointeur pour retourner un tableau 2D à partir d’une fonction en C++

On peut aussi utiliser une notation pointeur à pointeur pour retourner le tableau de la fonction. Cette méthode a un avantage sur les autres si les objets à retourner sont alloués de manière dynamique. Habituellement, il faut modifier l’expression d’accès à l’élément une fois que le pointeur est retourné dans la portée de l’appelant. Remarquez que l’adresse du tableau est exprimée en int* puis déréférencée pour obtenir les valeurs.

#include <iomanip>
#include <iostream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::setw;
using std::string;
using std::vector;

constexpr int SIZE = 4;

int **ModifyArr2(int *arr, int len) {
  for (int i = 0; i < len; ++i) {
    for (int j = 0; j < len; ++j) *(arr + (i * len) + j) *= 2;
  }
  return reinterpret_cast<int **>(arr);
}

int main() {
  int c_array[SIZE][SIZE] = {
      {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12}, {13, 14, 15, 16}};

  cout << "input array\n";
  for (auto &i : c_array) {
    cout << " [ ";
    for (int j : i) {
      cout << setw(2) << j << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  int **ptr2 = ModifyArr2(c_array[0], SIZE);

  cout << "modified array\n";
  for (int i = 0; i < SIZE; ++i) {
    cout << " [ ";
    for (int j = 0; j < SIZE; ++j) {
      cout << setw(2) << *((int *)ptr2 + (i * SIZE) + j) << ", ";
    }
    cout << "]" << endl;
  }
  cout << endl;

  return EXIT_SUCCESS;
}

Production :

input array
 [  1,  2,  3,  4, ]
 [  5,  6,  7,  8, ]
 [  9, 10, 11, 12, ]
 [ 13, 14, 15, 16, ]

modified array
 [  2,  4,  6,  8, ]
 [ 10, 12, 14, 16, ]
 [ 18, 20, 22, 24, ]
 [ 26, 28, 30, 32, ]
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C++ Array