Return a 2d array from a function

C++Multidimensional Array

C++ Problem Overview


Hi I am a newbie to C++ I am trying to return a 2d array from a function. It is something like this

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

  return cGrid;
}

C++ Solutions


Solution 1 - C++

This code returns a 2d array.

 #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 (int h = 0; h < height; h++) // loop variable wasn't declared
    	  {
    		delete [] my2DArray[h];
    	  }
    	  delete [] my2DArray;
    	  my2DArray = 0;
    	  printf("Ready.\n");
    
      return 0;
    }

Solution 2 - C++

A better alternative to using pointers to pointers is to use std::vector. That takes care of the details of memory allocation and deallocation.

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

Solution 3 - C++

That code isn't going to work, and it's not going to help you learn proper C++ if we fix it. It's better if you do something different. Raw arrays (especially multi-dimensional arrays) are difficult to pass correctly to and from functions. I think you'll be much better off starting with an object that represents an array but can be safely copied. Look up the documentation for std::vector.

In your code, you could use vector<vector<int> > or you could simulate a 2-D array with a 36-element vector<int>.

Solution 4 - C++

What you are (trying to do)/doing in your snippet is to return a local variable from the function, which is not at all recommended - nor is it allowed according to the standard.

If you'd like to create a int[6][6] from your function you'll either have to allocate memory for it on the free-store (ie. using new T/malloc or similar function), or pass in an already allocated piece of memory to MakeGridOfCounts.

Solution 5 - C++

The function returns a static 2D array

const int N = 6;
int (*(MakeGridOfCounts)())[N] {
 static int cGrid[N][N] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }};
 return cGrid;
}

int main() {
int (*arr)[N];
arr = MakeGridOfCounts();
}

You need to make the array static since it will be having a block scope, when the function call ends, the array will be created and destroyed. Static scope variables last till the end of program.

Solution 6 - C++

#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 ; 
}

Solution 7 - C++

Whatever changes you would make in function will persist.So there is no need to return anything.You can pass 2d array and change it whenever you will like.

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

or

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

Solution 8 - C++

returning an array of pointers pointing to starting elements of all rows is the only decent way of returning 2d array.

Solution 9 - C++

I would suggest you Matrix library as an open source tool for c++, its usage is like arrays in c++. Here you can see 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;
}

Solution 10 - C++

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;
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionuser1047092View Question on Stackoverflow
Solution 1 - C++Software_DesignerView Answer on Stackoverflow
Solution 2 - C++R SahuView Answer on Stackoverflow
Solution 3 - C++Michael KristofikView Answer on Stackoverflow
Solution 4 - C++Filip Roséen - refpView Answer on Stackoverflow
Solution 5 - C++Alam KhalidView Answer on Stackoverflow
Solution 6 - C++ahmadView Answer on Stackoverflow
Solution 7 - C++Nirav PatelView Answer on Stackoverflow
Solution 8 - C++Siba Prasad TripathyView Answer on Stackoverflow
Solution 9 - C++Amir FoView Answer on Stackoverflow
Solution 10 - C++user3785412View Answer on Stackoverflow