Retornar uma matriz 2d de uma function

Oi eu sou um novato em C ++ Eu estou tentando retornar uma matriz 2d de uma function. É algo parecido com isto

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

Este código retorna uma matriz 2d.

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

O que você está (tentando fazer) / fazer no seu trecho é retornar uma variável local da function, o que não é de todo recomendado – nem é permitido de acordo com o padrão.

Se você quiser criar um int[6][6] partir da sua function, você terá que alocar memory para ele no free-store (ou seja, usando o novo T / malloc ou function similar), ou passar um já alocado pedaço de memory para MakeGridOfCounts .

Esse código não vai funcionar e não ajudará você a aprender o C ++ se consertarmos. É melhor se você fizer algo diferente. Matrizes brutas (especialmente matrizes multidimensionais) são difíceis de passar corretamente para e de funções. Eu acho que você vai ser muito melhor começar com um object que representa uma matriz, mas pode ser copiado com segurança. Procure a documentação para std::vector .

Em seu código, você poderia usar vector > ou você poderia simular uma matriz 2-D com um vector 36 elementos vector .

Uma alternativa melhor para usar pointers para pointers é usar std::vector . Isso cuida dos detalhes de alocação de memory e desalocação.

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

Quaisquer alterações que você faria na function persistirá. Portanto, não há necessidade de retornar nada. Você pode passar a matriz 2d e alterá-la sempre que quiser.

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

retornar uma matriz de pointers apontando para os elementos iniciais de todas as linhas é a única maneira decente de retornar a matriz 2d.

Eu sugiro que você biblioteca Matrix como uma ferramenta de código aberto para c + +, seu uso é como matrizes em c + +. Aqui você pode ver a documentação .

 Matrix funcionName(){ Matrix arr(2, 2); arr[0][0] = 5; arr[0][1] = 10; arr[1][0] = 0; arr[1][1] = 44; return arr; }