关于在C语言 声明带有一个变长数组参数的函数

目前即使我把书上的例子照抄一遍,比如这个声明: int sum2d(int rows, int cols, int ar[rows][cols]); VC++的编译器还是显示错误,请问该如何解决呢
书上的例子:
#include <stdio.h>
int sum2d(int rows, int cols, int ar[rows][cols])
{
int r;
int c;
int tot = 0;

for(r=0; r<rows; r++)
for(c=0; c<cols; c++)
tot += ar[r][c];
return tot;
}

编译结果:
D:\VC++\chapter 10\test\est.cpp(2) : error C2057: expected constant expression
D:\VC++\chapter 10\test\est.cpp(2) : error C2466: cannot allocate an array of constant size 0
D:\VC++\chapter 10\test\est.cpp(2) : error C2057: expected constant expression
D:\VC++\chapter 10\test\est.cpp(2) : error C2466: cannot allocate an array of constant size 0
D:\VC++\chapter 10\test\est.cpp(2) : error C2087: '<Unknown>' : missing subscript
Error executing cl.exe.

test.exe - 5 error(s), 0 warning(s)

在C语言中,函数中要用数组做参数,可以采用三种方式,其中后两种均可适用于变长数组参数。
1 直接以定长数组做参数,声明形式为:
ret_type func(int a[100]);
这里就是以100个元素的数组做参数的。

2 声明时不带长度,即:
ret_type func(int a[]);

3 以指针替代数组,即:
ret_type func(int *a);

2,3两种均可以用于变长数组。不过这种情况下,需要与函数约定数组长度的确定方法,比如约定规模 ,约定结束值,增加额外参数传长度,在数组元素中包含长度,或采用全局变量传长度等等。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-09-24
#include <stdio.h>
int sum2d(int rows, int cols, int ar[][3]) //数组作为形参,传递的是地址,即数组名,
//对于二维数组,通常列数必须是常数,行数为空
//但一般数组地址的传递使用指针
{
int r;
int c;
int tot = 0;

for(r=0; r<rows; r++)
for(c=0; c<cols; c++)
tot += ar[r][c];
return tot;
}
void main()
{
int x;
int a[2][3]={1,2,3,4,5,6};
x=sum2d(2,3,a);
printf("%d\n",x);
}
第2个回答  2012-09-24
int ar[rows][cols]: 二维数组作参数时,你这里的rows和cols一定要是常数!

expected constant expression ====> understand?
第3个回答  2012-09-24
二维数组做函数参数时,形参的语法形式是:类型说明符 形参名[ ][常量表达式M]
形参数组可以省略一维的长度。
由于实参代表了数组名,是"地址传递",二维数组在内存中是按行存储的。在形参中,就必须指明列的个数,才能保证实参数组与形参数组中的数据一一对应,所以,形参数组中第二维的长度是不能省略的。
调用函数时,与形参数组相对应的实参数组必须也是一个二维数组,而且它的第二维的长度与形参数组的第二维的长度必须相等。
函数sum2d(int rows, int cols, int ar[rows][cols]) 的第三个参数数组ar的第二维必须给一个常数。追问

声明 带有二维数组做参数的函数,我知道第二维必须是常数,不过书中介绍 变长数组那一节,有两句话:1、创建一个处理任意二维数组的函数,也是有可能的,但是比较繁琐(因为这样的函数需要把数组当做一维数组传递,然后由函数计算每行的起始地址);2、C99标准引入了变长数组,它允许使用变量定义数组各维。(出自 C Primer Plus 第五版)然后我就抄下那段程式尝试编译。书上还有一段vararr2d.c的程序比较长我弄不上来,但也失败

追答

如果非要用两个维数都是变长的二维数组,那参数就用指针吧,再另外加上两个参数指明各个维数,然后程序中自己为二维数组寻址。
函数改为sum2d(int rows, int cols, int **ar),ar[r][c]改为 *((int*)ar +rows*r + c)。

追问

这个是不是因为VC++ 不支持C99 引入变长数组这一块啊?没想过还可以这么写 *((int*)ar +rows*r + c),受教了谢谢

追答

不用客气,互相讨论,共同进步,呵呵

本回答被提问者和网友采纳
第4个回答  2012-09-24
确认两个问题:
1.你建的工程是不是对的?
2.你的和这个调用函数,是在哪调用的,调用的时候,传入的参数是什么?

这些错误主要是一些参数不对,或者定义的数组不完全所致的!
相似回答