【问题标题】:Error when using two dimensional array as parameter in C++在 C++ 中使用二维数组作为参数时出错
【发布时间】:2015-01-17 19:21:14
【问题描述】:

我编写了一个 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);
}

【问题讨论】:

  • 您能找出导致您的第一个错误的原因吗?你知道那条消息是什么意思吗?
  • 用代码发布问题时,不要包含行号。它使复制粘贴代码变得更加困难。而是以其他方式标记问题所在的行。
  • 另外,您确定您正在使用 C++ 编程吗?代码中唯一特定于 C++ 的内容是标头 &lt;iostream&gt;using namespace std,其他一切都只是 C(例如使用 printf 和可变长度数组)。
  • @JoachimPileborg 很抱歉造成混淆,我实际上是用 C++ 编写的,但我是一名学习者,并且使用了一些 C 语法。谢谢。
  • @DrewDormann 对不起,我是一个新的 C++ 程序员,我不太确定。

标签: c++ arrays parameter-passing


【解决方案1】:

您遇到的第一个错误是由于传递数组的语法中的拼写错误。 应该是:

void findtrace(int i, int j, int s[][7])

不是:

void findtrace(int i, int j, int[][7] s)

另外,看看这个answer

【讨论】:

  • 请接受正确答案以结束问题。两个答案都是正确的。
【解决方案2】:

错误在这里

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])

也会好的

【讨论】:

  • 几乎正确,但是您的更改将导致函数期望指针数组,而不是指向数组的指针。这两者非常不同。此外,数组数组 not 与指向指针的指针相同,因此您的转换也是错误的。
  • @JoachimPileborg 我已经编辑过了。但是第一个对我来说每次都很好。
  • 是的,可以编译成功,但是运行后出现segmentation fault: len p = 7 15125 Segmentation fault: 11
  • 好吧,我看到您的数组有 7 个元素,并且您正在访问 s[][7],这将是无效的,因为在 c 中索引从 0 开始
  • 您能告诉我在哪里访问 s[ ][7]?在代码中,len = 7,但我将 len-1 作为 j 传递给函数 findtrace。由于j的最大值是len-1 = 6,所以我还是有点迷茫
【解决方案3】:

问题似乎出在递归函数中:由于某些逻辑错误而导致某种访问意志

变量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);
}

【讨论】:

  • 谢谢,确实是递归问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多