关于在C语言 声明带有一个变长数组参数的函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于在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)
1 直接以定长数组做参数,声明形式为:
ret_type func(int a[100]);
这里就是以100个元素的数组做参数的。
2 声明时不带长度,即:
ret_type func(int a[]);
3 以指针替代数组,即:
ret_type func(int *a);
2,3两种均可以用于变长数组。不过这种情况下,需要与函数约定数组长度的确定方法,比如约定规模 ,约定结束值,增加额外参数传长度,在数组元素中包含长度,或采用全局变量传长度等等。 参考技术A #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);
参考技术B int ar[rows][cols]: 二维数组作参数时,你这里的rows和cols一定要是常数!
expected constant expression ====> understand? 参考技术C 二维数组做函数参数时,形参的语法形式是:类型说明符 形参名[ ][常量表达式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),受教了谢谢
追答不用客气,互相讨论,共同进步,呵呵
本回答被提问者和网友采纳 参考技术D 确认两个问题:1.你建的工程是不是对的?
2.你的和这个调用函数,是在哪调用的,调用的时候,传入的参数是什么?
这些错误主要是一些参数不对,或者定义的数组不完全所致的!
声明一个带有数组参数的python函数并将一个数组参数传递给函数调用?
【中文标题】声明一个带有数组参数的python函数并将一个数组参数传递给函数调用?【英文标题】:Declaring a python function with an array parameters and passing an array argument to the function call? 【发布时间】:2012-08-09 05:29:30 【问题描述】:我是 python 的新手,并试图将数组作为参数传递给 python 函数,该函数将列表/数组声明为参数。
我确定我说错了,
这里是:
def dosomething(listparam):
#do something here
dosomething(listargument)
显然这不起作用,我做错了什么?
谢谢
【问题讨论】:
它应该可以工作。你能展示一些真实的代码吗? 您能否提供更多上下文,也许是失败的实际代码? (如果可能,请将其设为good example)。 声明是什么意思? 哦,是的,这绝对是我的错……我正在这样做:for x in range(len(list)): print x;而不是 print list[x] ...谢谢大家! 这看起来是正确的;您是否收到特定的错误消息?也许您还没有在 listargument 中声明/放入某些内容? 【参考方案1】:你所拥有的一切都在正确的轨道上。
def dosomething( thelist ):
for element in thelist:
print element
dosomething( ['1','2','3'] )
alist = ['red','green','blue']
dosomething( alist )
产生输出:
1
2
3
red
green
blue
鉴于您上面的评论,有几点需要注意:与 C 系列语言不同,您通常不需要在迭代列表时费心跟踪索引,除非索引本身很重要。但是,如果您确实需要索引,则可以使用 enumerate(list)
来获得 index,element
对,而不是使用 x in range(len(thelist))
跳舞。
【讨论】:
我想你的意思是enumerate(list)
【参考方案2】:
也许你想解压一个数组的元素,我不知道我明白了没有,下面是一个例子:
def my_func(*args):
for a in args:
print(a)
my_func(*[1,2,3,4])
my_list = ['a','b','c']
my_func(*my_list)
【讨论】:
【参考方案3】:我想我不清楚 OP 的真正要求是什么……你想传递整个数组/列表并在函数内部对其进行操作吗?或者您是否希望对数组/列表中的每个值/项执行相同的操作。如果后者是您希望的,我已经找到了一种行之有效的方法。
我更熟悉 Fortran 和 C 等编程语言,您可以在其中定义元素函数,这些函数对数组中的每个元素进行操作。我终于找到了与此等效的python,并认为我会在这里重新发布解决方案。关键是对函数进行“矢量化”。这是一个例子:
def myfunc(a,b):
if (a>b): return a
else: return b
vecfunc = np.vectorize(myfunc)
result=vecfunc([[1,2,3],[5,6,9]],[7,4,5])
print(result)
输出:
[[7 4 5]
[7 6 9]]
【讨论】:
以上是关于关于在C语言 声明带有一个变长数组参数的函数的主要内容,如果未能解决你的问题,请参考以下文章