在 C++ 中使用二维数组作为参数时出错
Error when using two dimensional array as parameter in C++
我编写了一个 c++ 程序来使用动态规划计算矩阵乘法问题。我用s[][]
来存放插入括号的地方。但是,我收到有关使用二维数组作为参数的错误:
matrics.cpp:4:38: error: expected ')'
void findtrace(int i, int j, int[][7]s){
^
matrics.cpp:4:15: note: to match this '('
void findtrace(int i, int j, int[][7]s){
^
matrics.cpp:8:17: error: use of undeclared identifier 's'
printf("%d\t",s[i][j]);
^
matrics.cpp:9:18: error: use of undeclared identifier 's'
findtrace(i,s[i][j],s);
^
matrics.cpp:10:13: error: use of undeclared identifier 's'
findtrace(s[i+1][j],j,s);
^
matrics.cpp:42:2: error: no matching function for call to 'findtrace'
findtrace(1,len-1,s);
^~~~~~~~~
matrics.cpp:4:6: note: candidate function not viable: no known conversion from 'int [len][len]' to 'int (*)[7]' for 3rd argument
void findtrace(int i, int j, int[][7]s){
^
5 errors generated.
调试这个花了我两个小时;但是,我仍然有那个错误。任何人都可以帮助我吗?
#include <iostream>
using namespace std;
void findtrace(int i, int j, int[][7] s){
if(i==j)
printf("%d\t", i);
else{
printf("%d\t",s[i][j]);
findtrace(i,s[i][j],s);
findtrace(s[i+1][j],j,s);
}
}
int main(){
int p[] = {30,35,15,5,10,20,25};
int len = sizeof(p)/sizeof(p[0]);
//void findtrace(int[][len]s, int i, int j);
int m[len][len];
int s[len][len];
printf("len p = %d\n",len);
for(int i=1;i<=len;i++)
m[i][i] = 0;
int temp;
for(int k=1;k<len;++k){
for(int j=k+1;j<len;++j){
int i = j-k;
m[i][j] = m[i][i]+m[i+1][j]+p[i]*p[i-1]*p[j];
s[i][j] = i;
for(int t=i+1;t<j;++t){
if( m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t]<m[i][j] )
m[i][j] = m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t];
s[i][j] = t;
}
//printf("m[%d][%d] = %d\t",i,j,m[i][j]);
}
}
printf("\n%d\n",m[1][len-1]);
findtrace(1,len-1,s);
}
错误在这里
void findtrace(int i, int j, int[][7] s)
应该是
void findtrace(int i, int j, int *s[])
^^^
并将其命名为
findtrace(1,len-1,(int **)s);
如果编译器兼容 C99
从 C99 开始,C 语言支持可变大小的数组,只需指定可变维度即可传递
void findtrace(int i, int j, int s[][7])
也会好的
您遇到的第一个错误是由于传递数组的语法中的拼写错误。
应该是:
void findtrace(int i, int j, int s[][7])
不是:
void findtrace(int i, int j, int[][7] s)
另外,看看这个answer。
问题似乎出在递归函数中:由于某些逻辑错误导致某种访问意志
变量 i
保存了值 -858993460
所以当涉及到 printf("%d\t",s[i][j]);
时它给出了访问冲突 因为这样的索引不存在
另一个问题是 const int len = sizeof(p)/sizeof(int);
而不是使用简单的 int,
形式有点精炼,但逻辑仍需修正
void findtrace(int i, int j, int s[][7])
{
if(i==j)
printf("%d\t", i);
else{
printf("%d\t",s[i][j]);
findtrace(i,s[i][j],s);
findtrace(s[i+1][j],j,s);
}
}
int main(){
int p[] = {30,35,15,5,10,20,25};
const int len = sizeof(p)/sizeof(int);
//void findtrace(int[][len]s, int i, int j);
int m[len][len];
int s[len][len];
printf("len p = %d\n",len);
for(int i=1;i<=len;i++)
m[i][i] = 0;
// int temp;
for(int k=1;k<len;++k){
for(int j=k+1;j<len;++j){
int i = j-k;
m[i][j] = m[i][i]+m[i+1][j]+p[i]*p[i-1]*p[j];
s[i][j] = i;
for(int t=i+1;t<j;++t){
if( m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t]<m[i][j] )
m[i][j] = m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t];
s[i][j] = t;
}
//printf("m[%d][%d] = %d\t",i,j,m[i][j]);
}
}
printf("\n%d\n",m[1][len-1]);
findtrace(1,len-1,s);
}
我编写了一个 c++ 程序来使用动态规划计算矩阵乘法问题。我用s[][]
来存放插入括号的地方。但是,我收到有关使用二维数组作为参数的错误:
matrics.cpp:4:38: error: expected ')'
void findtrace(int i, int j, int[][7]s){
^
matrics.cpp:4:15: note: to match this '('
void findtrace(int i, int j, int[][7]s){
^
matrics.cpp:8:17: error: use of undeclared identifier 's'
printf("%d\t",s[i][j]);
^
matrics.cpp:9:18: error: use of undeclared identifier 's'
findtrace(i,s[i][j],s);
^
matrics.cpp:10:13: error: use of undeclared identifier 's'
findtrace(s[i+1][j],j,s);
^
matrics.cpp:42:2: error: no matching function for call to 'findtrace'
findtrace(1,len-1,s);
^~~~~~~~~
matrics.cpp:4:6: note: candidate function not viable: no known conversion from 'int [len][len]' to 'int (*)[7]' for 3rd argument
void findtrace(int i, int j, int[][7]s){
^
5 errors generated.
调试这个花了我两个小时;但是,我仍然有那个错误。任何人都可以帮助我吗?
#include <iostream>
using namespace std;
void findtrace(int i, int j, int[][7] s){
if(i==j)
printf("%d\t", i);
else{
printf("%d\t",s[i][j]);
findtrace(i,s[i][j],s);
findtrace(s[i+1][j],j,s);
}
}
int main(){
int p[] = {30,35,15,5,10,20,25};
int len = sizeof(p)/sizeof(p[0]);
//void findtrace(int[][len]s, int i, int j);
int m[len][len];
int s[len][len];
printf("len p = %d\n",len);
for(int i=1;i<=len;i++)
m[i][i] = 0;
int temp;
for(int k=1;k<len;++k){
for(int j=k+1;j<len;++j){
int i = j-k;
m[i][j] = m[i][i]+m[i+1][j]+p[i]*p[i-1]*p[j];
s[i][j] = i;
for(int t=i+1;t<j;++t){
if( m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t]<m[i][j] )
m[i][j] = m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t];
s[i][j] = t;
}
//printf("m[%d][%d] = %d\t",i,j,m[i][j]);
}
}
printf("\n%d\n",m[1][len-1]);
findtrace(1,len-1,s);
}
错误在这里
void findtrace(int i, int j, int[][7] s)
应该是
void findtrace(int i, int j, int *s[])
^^^
并将其命名为
findtrace(1,len-1,(int **)s);
如果编译器兼容 C99
从 C99 开始,C 语言支持可变大小的数组,只需指定可变维度即可传递
void findtrace(int i, int j, int s[][7])
也会好的
您遇到的第一个错误是由于传递数组的语法中的拼写错误。 应该是:
void findtrace(int i, int j, int s[][7])
不是:
void findtrace(int i, int j, int[][7] s)
另外,看看这个answer。
问题似乎出在递归函数中:由于某些逻辑错误导致某种访问意志
变量 i
保存了值 -858993460
所以当涉及到 printf("%d\t",s[i][j]);
时它给出了访问冲突 因为这样的索引不存在
另一个问题是 const int len = sizeof(p)/sizeof(int);
而不是使用简单的 int,
形式有点精炼,但逻辑仍需修正
void findtrace(int i, int j, int s[][7])
{
if(i==j)
printf("%d\t", i);
else{
printf("%d\t",s[i][j]);
findtrace(i,s[i][j],s);
findtrace(s[i+1][j],j,s);
}
}
int main(){
int p[] = {30,35,15,5,10,20,25};
const int len = sizeof(p)/sizeof(int);
//void findtrace(int[][len]s, int i, int j);
int m[len][len];
int s[len][len];
printf("len p = %d\n",len);
for(int i=1;i<=len;i++)
m[i][i] = 0;
// int temp;
for(int k=1;k<len;++k){
for(int j=k+1;j<len;++j){
int i = j-k;
m[i][j] = m[i][i]+m[i+1][j]+p[i]*p[i-1]*p[j];
s[i][j] = i;
for(int t=i+1;t<j;++t){
if( m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t]<m[i][j] )
m[i][j] = m[i][t]+m[t+1][j]+p[i-1]*p[j]*p[t];
s[i][j] = t;
}
//printf("m[%d][%d] = %d\t",i,j,m[i][j]);
}
}
printf("\n%d\n",m[1][len-1]);
findtrace(1,len-1,s);
}