将 int*** 传递给函数

时间:2021-01-07 17:05:07

标签: c++ pointers multidimensional-array parameter-passing

我有一个变量 int*** dp,我想通过引用将它传递给一个函数来初始化它。但是当我尝试调用该函数时:

int*** dp;
int c1, c2, c3;
void initialize(int*** d)
{
    d = new int**[c1 + 1];
    for(int i = 0; i <= c1; i++)
    {
        d[i] = new int*[c2 + 1];
        for(int j = 0; j <= c2; j++)
        {
            d[i][j] = new int[c3 + 1];
            for(int k = 0; k <= c3; k++)
            {
                d[i][j][k] = 0;
            }
        }
    }
    d[0][0][0] = 1;
}

initialize(dp);

我收到以下编译错误:从“int”到“int***”的无效转换 [-fpermissive]。

即使我尝试通过引用传递它:

void initialize(int*** &d)

还是不行!你能解释一下为什么它不起作用以及我如何解决它吗?

1 个答案:

答案 0 :(得分:2)

这个问题有点难回答,因为上面还有两个更基本的问题:

  1. 了解 C++ 标准库和 C++ 处理矩阵的方式,以及
  2. 了解此类函数的总体结构。

对于第一个问题(如何在 C++ 中矩阵)请参阅 https://www.boost.org/doc/libs/1_75_0/libs/numeric/ublas/doc/matrix.html(Boost 做了一些非常硬编码的东西,所以要做好准备。)

我将重点讨论第二个问题。

分配资源的函数(比如这里的几个int)应该return那个资源,而不是操作它的参数。同样,描述资源的参数(在您的例子中是维度)应该是参数。所以你的函数变成了:

int*** new_matrix(int c1, int c2, int c3) {
    int*** d = new int**[c1];
    for(int i = 0; i < c1; i++)
    {
        d[i] = new int*[c2];
        for(int j = 0; j < c2; j++)
        {
            d[i][j] = new int[c3];
            for(int k = 0; k < c3; k++)
            {
                d[i][j][k] = 0;
            }
        }
    }
    d[0][0][0] = 1;
    return d;
}

调用它返回新矩阵:

int*** dp = new_matrix(1, 2, 3);

还有一件事:在 C/C++ 中,您不做这 c1+1 业务。 v 的向量 c1=2 有两个元素,v[0]v[1]。不要胡闹v=new int[c1+1]; v[2]=0;。在 C/C++ 中,它没有完成。原因如下:https://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html