主题:怎么实现这样一个传递二维数组的问题
kingsky
[专家分:20] 发布于 2010-09-15 09:51:00
定义一个函数,需要传入一个二维数组
void fnc(float a[][200],float bb)
{
//比如实现的是一个二维数组的求和.............
}
现在需要循环调用这个这个函数,传入的是某个下标确定的三维数组,实际上也就是一个二维数组
for(int i=1;i<20;i++)
{
fnc(c[][i][],cc[i])
}
请问这段伪码改如何实现啊?
回复列表 (共8个回复)
沙发
windy0will [专家分:2300] 发布于 2010-09-21 16:51:00
我想楼主这样fnc(c[][i][],cc[i])这样调用函数很有可能是错的。除非您的c是个5维数组,cc是1维数组。如果您的cc,c分别是这样声明的:float c[20][20][200], cc[20];可以这样调用fnc函数
fnc(c[合适的下标][i],cc[i]);
板凳
强强 [专家分:4740] 发布于 2010-09-21 17:48:00
引用就可以
3 楼
windy0will [专家分:2300] 发布于 2010-09-21 18:01:00
C++我还是不怎么懂,过一项子我再去学C++.
4 楼
强强 [专家分:4740] 发布于 2010-09-21 18:51:00
方法1:
int fun(int (*)[6][7]);
int main(int argc,char *argv[])
{
int a[5][6][7];
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<7;k++)
{
a[i][j][k]=111;
}
}
}
fun(a);
return 0;
}
//
int fun(int (*p)[6][7])
{
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<7;k++)
{
cout<<*(*(*(p+i)+j)+k)<<",";
}
}
}
return 0;
}
方法2:
int fun(int (*)[6][7]);
int main(int argc,char *argv[])
{
int a[5][6][7];
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<7;k++)
{
a[i][j][k]=111;
}
}
}
fun(a);
return 0;
}
//
int fun(int p[5][6][7])//此行有改变
{
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<7;k++)
{
cout<<*(*(*(p+i)+j)+k)<<",";
}
}
}
return 0;
}
方法3:
int fun(int (*)[6][7]);
int main(int argc,char *argv[])
{
int a[5][6][7];
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<7;k++)
{
a[i][j][k]=111;
}
}
}
fun(a);
return 0;
}
//
int fun(int p[5][6][7])
{
for(int i=0;i<5;i++)
{
for(int j=0;j<6;j++)
{
for(int k=0;k<7;k++)
{
cout<<p[i][j][k]<<",";//此行有改变
}
}
}
return 0;
}
5 楼
windy0will [专家分:2300] 发布于 2010-09-21 19:15:00
回 强强 :
您上面给出的代码,把cout改成printf好像也可以看做是纯C吧?
在C中,
int fun(int (*p)[6][7]);
int fun(int p[5][6][7]);
int fun(int p[ ][6][7]);
这3个申明完全是等价的,都被解释为int fun(int (*p)[6][7]);
还有*(*(*(p+i)+j)+k); 和p[i][j][k];也完全是等价的,都被解释为*(*(*(p+i)+j)+k);
数组用下标访问它的值的时候也是用指针来实现的吧,如p[n]和*(p+n)或者*(n+p)或者n[p]这几个完全等价。就是这个原因,在把数组做函数形参的时候,除了第一个下标,其他的药全部给出,不然如果有int fun(int p[][][]),如果有p[i][j][k],系统就不知道p+i到底应该是多少,就跟void*是不能有加法一样。
应该C++中的引用不是这样的吧?
6 楼
强强 [专家分:4740] 发布于 2010-09-22 14:25:00
[quote]回 强强 :
您上面给出的代码,把cout改成printf好像也可以看做是纯C吧?
在C中,
int fun(int (*p)[6][7]);
int fun(int p[5][6][7]);
int fun(int p[ ][6][7]);
这3个申明完全是等价的,都被解释为int fun(int (*p)[6][7]);
还有*(*(*(p+i)+j)+k); 和p[i][j][k];也完全是等价的,都被解释为*(*(*(p+i)+j)+k);
数组用下标访问它的值的时候也是用指针来实现的吧,如p[n]和*(p+n)或者*(n+p)或者n[p]这几个完全等价。就是这个原因,在把数组做函数形参的时候,除了第一个下标,其他的药全部给出,不然如果有int fun(int p[][][]),如果有p[i][j][k],系统就不知道p+i到底应该是多少,就跟void*是不能有加法一样。
应该C++中的引用不是这样的吧?
[/quote]
嘿嘿嘿,说的是,上面写的不是引用,呵呵,我忘说了,就是在纯C中的,可能是我用"方法"这个词不太恰当,应该是"写法",哈哈
7 楼
强强 [专家分:4740] 发布于 2010-09-22 14:26:00
用"引用"应该比这简单多了,呵呵,感谢热心的windy0will
8 楼
cgl_lgs [专家分:21040] 发布于 2010-09-22 15:45:00
改用vector就行了。
我来回复