web-dev-qa-db-fra.com

Retourne un tableau 2D d'une fonction

Salut, je suis un débutant en C++ J'essaie de retourner un tableau 2D à partir d'une fonction . C'est quelque chose comme ça

int **MakeGridOfCounts(int Grid[][6])
{
  int cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }};

  return cGrid;
}
36
user1047092

Ce code retourne un tableau 2D.

 #include <cstdio>

    // Returns a pointer to a newly created 2d array the array2D has size [height x width]

    int** create2DArray(unsigned height, unsigned width)
    {
      int** array2D = 0;
      array2D = new int*[height];

      for (int h = 0; h < height; h++)
      {
            array2D[h] = new int[width];

            for (int w = 0; w < width; w++)
            {
                  // fill in some initial values
                  // (filling in zeros would be more logic, but this is just for the example)
                  array2D[h][w] = w + width * h;
            }
      }

      return array2D;
    }

    int main()
    {
      printf("Creating a 2D array2D\n");
      printf("\n");

      int height = 15;
      int width = 10;
      int** my2DArray = create2DArray(height, width);
      printf("Array sized [%i,%i] created.\n\n", height, width);

      // print contents of the array2D
      printf("Array contents: \n");

      for (int h = 0; h < height; h++)
      {
            for (int w = 0; w < width; w++)
            {
                  printf("%i,", my2DArray[h][w]);
            }
            printf("\n");
      }

          // important: clean up memory
          printf("\n");
          printf("Cleaning up memory...\n");
          for (  h = 0; h < height; h++)
          {
            delete [] my2DArray[h];
          }
          delete [] my2DArray;
          my2DArray = 0;
          printf("Ready.\n");

      return 0;
    }
34
Software_Designer

Une meilleure alternative à l'utilisation de pointeurs à pointeurs est d'utiliser std::vector. Cela s’occupe des détails de l’allocation de mémoire et de la désallocation.

std::vector<std::vector<int>> create2DArray(unsigned height, unsigned width)
{
   return std::vector<std::vector<int>>(height, std:vector<int>(width, 0));
}
4
R Sahu

Ce code ne fonctionnera pas et ne vous aidera pas à apprendre le bon C++ si nous le corrigeons. C'est mieux si vous faites quelque chose de différent. Les tableaux bruts (en particulier les tableaux multidimensionnels) sont difficiles à transmettre correctement aux fonctions. Je pense que vous ferez bien mieux de commencer avec un objet qui représente un tableau mais peut être copié en toute sécurité. Recherchez la documentation pour std::vector.

Dans votre code, vous pouvez utiliser vector<vector<int> > ou simuler un tableau à deux dimensions avec un vector<int> à 36 éléments.

4
Michael Kristofik

Ce que vous (essayez de faire)/faites dans votre extrait de code est de renvoyer une variable locale à partir de la fonction, ce qui n’est pas du tout recommandé - cela n’est pas autorisé non plus selon la norme.

Si vous souhaitez créer un int[6][6] à partir de votre fonction, vous devrez soit lui allouer de la mémoire sur le magasin libre (c'est-à-dire, utiliser new T/malloc ou une fonction similaire), soit transmettre une commande déjà allouée. morceau de mémoire à MakeGridOfCounts.

4
#include <iostream>
using namespace std ;

typedef int (*Type)[3][3] ;

Type Demo_function( Type ); //prototype

int main (){
    cout << "\t\t!!!!!Passing and returning 2D array from function!!!!!\n"

    int array[3][3] ;
    Type recieve , ptr = &array;
    recieve = Demo_function( ptr ) ;

    for ( int i = 0 ;  i < 3 ; i ++ ){
        for ( int j = 0 ; j < 3 ; j ++ ){
            cout <<  (*recieve)[i][j] << " " ;
        }
    cout << endl ; 
    }

return 0 ;
}


Type Demo_function( Type array ){/*function definition */

    cout << "Enter values : \n" ;
    for (int i =0 ;  i < 3 ; i ++)
        for ( int j = 0 ; j < 3 ; j ++ )
            cin >> (*array)[i][j] ;

    return array ; 
}
1
ahmad

Quels que soient les changements que vous feriez dans la fonction, ils persisteront. Ainsi, il n’y aura pas besoin de renvoyer quoi que ce soit.Vous pouvez passer un tableau 2D et le changer à tout moment.

  void MakeGridOfCounts(int Grid[][6])
    {
      cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }};

    }

ou

void MakeGridOfCounts(int Grid[][6],int answerArray[][6])
    {
     ....//do the changes in the array as you like they will reflect in main... 
    }
0
Nirav Patel

Je vous suggérerais Matrix library en tant qu'outil open source pour c ++, son utilisation ressemble à celle des tableaux en c ++. Ici vous pouvez voir documention .

Matrix funcionName(){

    Matrix<int> arr(2, 2);

    arr[0][0] = 5;
    arr[0][1] = 10;
    arr[1][0] = 0;
    arr[1][1] = 44;

    return arr;
}
0
Amir Forsati
int** create2DArray(unsigned height, unsigned width)
{
     int** array2D = 0;
     array2D = new int*[height];

     for (int h = 0; h < height; h++)
     {
          array2D[h] = new int[width];

          for (int w = 0; w < width; w++)
          {
               // fill in some initial values
               // (filling in zeros would be more logic, but this is just for the example)
               array2D[h][w] = w + width * h;
          }
     }

     return array2D;
}

int main ()
{

    printf("Creating a 2D array2D\n");
    printf("\n");

    int height = 15;
    int width = 10;
    int** my2DArray = create2DArray(height, width);
    printf("Array sized [%i,%i] created.\n\n", height, width);

    // print contents of the array2D
    printf("Array contents: \n");

    for (int h = 0; h < height; h++)
    {
         for (int w = 0; w < width; w++)
         {
              printf("%i,", my2DArray[h][w]);
         }
         printf("\n");
    }

    return 0;
}
0
user3785412

renvoyer un tableau de pointeurs pointant vers les éléments de départ de toutes les lignes est la seule façon décente de retourner un tableau 2d.

0