【问题标题】:Pasing int*** to a function [closed]将 int*** 传递给函数 [关闭]
【发布时间】:2021-04-13 10:36:45
【问题描述】:

我有一个变量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)

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

【问题讨论】:

  • 对我来说,任何type*** 都是在类中封装矩阵失败。模拟矩阵是无效的方法。 std::vector&lt;std::vector&lt;std::vector&lt;int&gt;&gt;&gt; 会更好,但还是很烂。
  • 不要成为three star programmer,尤其是在 C++ 中。
  • 你用的是什么编译器? initialize(int***&amp;d) 变体,虽然真的真的 糟糕的风格(不要将它投入生产),但适用于 GNU C++ 8.3.0。
  • 哪一行给出了那个错误。您粘贴的代码中的任何行都不应该出现该错误?
  • 你不能把函数调用放在不知名的地方,请出示minimal reproducible example

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


【解决方案1】:

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

  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 业务。 c1=2 的向量 v 有两个元素,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

【讨论】:

  • @Kevin 是对的,当然,不要成为三星级程序员,但我假设你这样做是为了学习/作为一项任务,所以我就跟着它跑。对于生产,只需使用 boost 的矩阵类。它更快、更强大,而且确实有效。
猜你喜欢
  • 1970-01-01
  • 2020-10-10
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多