【问题标题】:void Name(type name1,type name2, type name3[name1][name2] );无效名称(类型名称1,类型名称2,类型名称3[名称1][名称2]);
【发布时间】:2013-05-05 19:32:15
【问题描述】:

我不知道为什么我的 Microsoft Visual C++ 2010 Express 不支持这样的代码:

void ar(int n,int m, short ar[n][m]);

发生的事情是字母 n 和 m 被红色隐藏起来,它说:

//Error: a parameter is not allowed.

我正在用 C 编写代码,目前正在尝试学习指针和数组。

【问题讨论】:

  • 这是声明还是定义?

标签: c arrays void


【解决方案1】:

您不能让传递的数组大小依赖于变量(此外,传递相同的签名)。它在 Clang 中编译,但不是合法的 C89,它是 C99,AFAIK Microsoft VC 不完全支持。

请注意:您使用相同的名称调用函数及其参数,这可能会导致有趣、晦涩的错误。 重命名函数或最后一个参数。

编辑:尝试编译:

void ar(int n,int m, short ars[n][m])
{
}

int main()
{
    short a[1][2] = {{22,22}};
    ar(1,2,a);
}

它适用于我系统上安装的所有编译器,所以如果它不能编译,要么你的 IDE 中启用了非标准的、公开的设置,要么你非常需要一个像样的编译器。

【讨论】:

  • 这意味着:立即将参数重命名为其他名称。
  • 当我这样写时: void ar(int n,int m, short ar[][]);它编译为第一个括号,最后一个括号是一个数组,两个 ][ 就像编译器认为我声明的数字一样。然后它也不起作用。错误。数组可能没有这种类型的元素
  • 然后试试void ar(int n,int m, short **ar)。如果可行,请使用更符合标准的编译器,例如 Clang、Intel 或 GCC。
  • 我也尝试过 b4 发布,因为我知道我想使用 2 个数组,但它不起作用,我认为它会但不适合我 ;S
  • 重命名第三个参数。你上面说的不正确:][ 不是数字,你不能欺骗编译器认为它是。
【解决方案2】:

试试这个:

   void ar(int,int,short (*)[]);

如果是声明和

void ar(int m,int n,short (*ar)[]){} // Refer my Edit

这是函数的定义。

编辑您是否真的为函数使用相同的名称以及您尝试作为参数传递给函数的二维数组?

【讨论】:

  • 我想产生的东西是:void ar(int n,int m, short (*ar)[]) { int r;诠释 c; for( r = 0; r
【解决方案3】:

VC (C89) 无法像您的代码那样编写。

对于这样的 VC

#include <stdio.h>

void ar(int n,int m, short *a){
    int i,j, total=0;
    for(i=0;i<n;++i)
        for(j=0;j<m;++j)
            total += a[i*m+j];
    printf("total=%d\n", total);
}
int main(void){
    short a[2][3] = {{1,2,3},{4,5,6}};
    ar(2, 3, a);// a -> &a[0][0]
    return 0;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-11
    • 2020-06-01
    • 1970-01-01
    • 2010-10-19
    • 2011-02-04
    相关资源
    最近更新 更多