【问题标题】:How to return data type int** from a fuction and store it?如何从函数返回数据类型 int** 并存储它?
【发布时间】:2021-03-16 15:43:58
【问题描述】:

我编写了一个使用 Loubere 算法求解幻方的代码。我已经为这个算法创建了一个函数,我想使用 int** 返回一个值,但是我应该怎么做,因为我在函数体中使用了 2D 数组,我应该如何将它存储在 main() 函数中

#include <iostream>
#include <cstdlib>
using namespace std ;
int ** magicSquare ( int size )
{
int number;
int sq=size*size;enter code here
int mid=size/2;
//for array
int m=0; 

//rows
int n=mid; //columns
array[m][n]=n;
for(number=1; number<=sq; number++)
{
n++;
n=n-1;
m=m+1;
if(n==-1)
n=3;
if(m==3)
m=0;
if (array[n][m]  !=0)
n++;
array[n][m]=number;
}
int* array_rows[size]=array[size][size];    
int** p=array_rows;
return p;
}
int main()
{
int dimension;
cout<<"Enter dimension of the magic square : "; cin>>dimension;
magicSquare ( dimension );
}

【问题讨论】:

  • 返回 std::vector&lt;std::vector&lt;int&gt;&gt; 而不是 int**
  • 你需要正确缩进你的代码。
  • 这行array[m][n]=n;你打算做什么?
  • 你需要先分配一个数组
  • “返回二维数组”和“返回int**”是有区别的。您想要前者,但您的代码执行后者。指针不是数组

标签: c++ arrays algorithm


【解决方案1】:

按照建议,您可以使用std::vector&lt;std::vector&lt;int&gt;&gt; 来存储您的数据并正确返回。像这样的:

#include <vector>
#include <iostream>

using square = std::vector<std::vector<int>>;

square makeMagicSquare(size_t size) {
    square magicSquare(size, std::vector(size, 0));

    // <-- Your code here
    // magicSquare[i][j] = ...;

    return magicSquare;
}

int main()
{
    square sq = makeMagicSquare(10);

    // Print it
    for (auto& row: sq) {
        for (auto& cell: row) {
            std::cout << cell << ' ';
        }
        std::cout << '\n';
    }
}

【讨论】:

    【解决方案2】:

    如果要将其存储为数组,则需要更改方法以返回 int[][] 而不是 int**。它们的工作方式非常相似,但指针和数组之间存在区别。

    您可以完全按照您的预期将其存储为int[][]。存储幻方如下:

    int[][] magicSquare = magicSquare(dimension);
    

    这会将您的方法的返回值分配给一个二维数组,然后您必须在程序结束时释放该数组。

    请记住,数组的工作方式是给出数据块头部的地址。当您返回一个数组时,即使它是int[][],您也正在引用一个数据块的地址。在这种情况下,它是一个 int 数组块。为了以后访问它,您需要先分配该内存块,然后才能对其进行任何操作。这意味着在您的magicSquare() 方法中,您将需要创建一个包含信息的int[][],并且您可以将其传递给int[][]

    免责声明:您绝对可以使用指针来执行此操作,但使用std::vector&lt;std::vector&lt;int&gt;&gt; 会更容易且不太可能导致错误。使用std::vector,您不必分配或释放内存,它可以处理潜在的未定义行为,例如读取数据块的末尾。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      • 2015-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多