我有一个变量 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)
还是不行!你能解释一下为什么它不起作用以及我如何解决它吗?
答案 0 :(得分: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