Restituisce un array 2d da una funzione

Ciao sono un novizio di C ++ sto cercando di restituire un array 2d da una funzione. È qualcosa come questo

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

Questo codice restituisce un array 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; } 

Quello che sei (cercando di fare) / fare nel tuo snippet è quello di restituire una variabile locale dalla funzione, che non è affatto raccomandata – né è consentita in base allo standard.

Se vuoi creare un int[6][6] dalla tua funzione dovrai allocare memoria per questo nel free-store (cioè usando una nuova T / malloc o una funzione simile), o passare in un porzione di memoria già assegnata a MakeGridOfCounts .

Quel codice non funzionerà e non ti aiuterà a imparare il C ++ corretto se lo aggiustiamo. È meglio se fai qualcosa di diverso. Gli array grezzi (specialmente gli array multidimensionali) sono difficili da trasferire correttamente da e verso le funzioni. Penso che starai molto meglio iniziando con un object che rappresenta un array ma che può essere copiato in modo sicuro. Cerca la documentazione per std::vector .

Nel tuo codice, puoi usare vector > oppure puoi simulare un array 2-D con un vector 36 elementi vector .

Un’alternativa migliore all’uso dei puntatori ai puntatori è l’uso di std::vector . Questo si occupa dei dettagli dell’allocazione della memoria e della deallocazione.

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

Qualunque cambiamento faresti nella funzione persisterà. Quindi non c’è bisogno di restituire nulla. Puoi passare 2d array e cambiarlo quando vuoi.

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

o

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

restituire un array di puntatori che puntano agli elementi di partenza di tutte le righe è l’unico modo decente per restituire un array 2d.

Ti suggerirei la libreria Matrix come uno strumento open source per c ++, il suo utilizzo è come gli array in c ++. Qui puoi vedere la documentazione .

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