Подтвердить что ты не робот

Возвращает 2d-массив из функции

Привет, я новичок в С++ Я пытаюсь вернуть 2d-массив из функции. Это что-то вроде этого

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

  return cGrid;
}
4b9b3361

Ответ 1

Этот код возвращает 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;
    }

Ответ 2

Этот код не будет работать, и он не поможет вам узнать правильный С++, если мы его исправим. Лучше, если вы сделаете что-то другое. Необработанные массивы (особенно многомерные массивы) трудно передать правильно и от функций. Я думаю, вам будет намного лучше начать с объекта, который представляет массив, но может быть безопасно скопирован. Просмотрите документацию для std::vector.

В вашем коде вы можете использовать vector<vector<int> >, или вы можете имитировать двухмерный массив с 36-элементным vector<int>.

Ответ 3

Лучшей альтернативой использованию указателей на указатели является использование std::vector. Это заботится о деталях выделения памяти и освобождения.

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

Ответ 4

То, что вы пытаетесь сделать/выполняете в своем фрагменте, - это вернуть локальную переменную из этой функции, которая совсем не рекомендуется - и она не разрешена в соответствии со стандартом.

Если вы хотите создать int[6][6] из своей функции, вам нужно будет выделить память для него в свободном хранилище (т.е. используя новый T/malloc или аналогичную функцию) или передать уже выделенный фрагмент памяти MakeGridOfCounts.

Ответ 5

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

Ответ 6

Все изменения, которые вы сделали бы в функции, будут сохраняться. Так что нет необходимости возвращать что-либо. Вы можете передать 2d-массив и изменить его, когда захотите.

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

    }

или

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

Ответ 7

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

Ответ 8

возврат массива указателей, указывающих на начальные элементы всех строк, является единственным достойным способом возврата массива 2d.

Ответ 9

Я бы предложил вам библиотеку Matrix в качестве инструмента с открытым исходным кодом для c++, ее использование подобно массивам в c++. Здесь вы можете увидеть документацию.

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