c语言函数中如何调用数组
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
c语言函数中如何调用数组
这是我编的一个松驰法迭代的一个算例,想用函数调用数组,可是总是出错,比如定义函数float max( float a[] ,float b[])这样调用的话,在那个a ,b的形式对吗?是要具体写出数组个数的还是怎么样的,搞不清,我的程序如下:
#include<stdio.h>
#include<math.h>
#define n 10
float max(float x[n+1][n+1],float z[n+1][n+1])
{int a,b;
float min[n+1][n+1],m=0;
for(a=1;a<=n;a++)
{for(b=1;b<=n;b++)
{min[a]=z[a]-x[a];
if(fasb(min[a])>m) m=fabs(min[a]);}
}
return(m);
}
int main(void)
{
int i,j,k,it=100,c,w;
float x[n+1][n+1],y[n+1][n+1],z[n+1][n+1],epsi=1e-6,l;
c=1/4;
for(i=1;i<=n;i++)
{x[1]=y[1]=0;
x[1]=y[1]=0;
x[n]=y[n]=0;}
for(i=2;i<=n-1;i++)
{for(j=2;j<=n-1;j++)
{x[j]=1;}
}
for(k=1;k<it;k++)
{for(i=2;i<=n-1;i++)
{for(j=2;j<=n-1;j++)
{y[j]=c*(x[i+1][j]+y[i-1][j])+c*(x[j+1]+y[j-1]);
z[i][j]=x[i][j]+w*(y[i][j]-x[i][j]);
x[i][j]=y[i][j];
l=max(x[i][j],z[i][j]);
}
}
if(l<epsi)
{for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%d z[%d][%d]=\n",k,z[i][j]);
}
}
}
}
错误反馈是这样的:
homework.c:33:1: error: incompatible type for argument 1 of ‘max’
homework.c:4:7: note: expected ‘float (*)[11]’ but argument is of type ‘float’
homework.c:33:1: error: incompatible type for argument 2 of ‘max’
homework.c:4:7: note: expected ‘float (*)[11]’ but argument is of type ‘float’
#include<stdio.h>
#include<math.h>
#define n 10
float max(float x[n+1][n+1],float z[n+1][n+1])
{int a,b;
float min[n+1][n+1],m=0;
for(a=1;a<=n;a++)
{for(b=1;b<=n;b++)
{min[a]=z[a]-x[a];
if(fasb(min[a])>m) m=fabs(min[a]);}
}
return(m);
}
int main(void)
{
int i,j,k,it=100,c,w;
float x[n+1][n+1],y[n+1][n+1],z[n+1][n+1],epsi=1e-6,l;
c=1/4;
for(i=1;i<=n;i++)
{x[1]=y[1]=0;
x[1]=y[1]=0;
x[n]=y[n]=0;}
for(i=2;i<=n-1;i++)
{for(j=2;j<=n-1;j++)
{x[j]=1;}
}
for(k=1;k<it;k++)
{for(i=2;i<=n-1;i++)
{for(j=2;j<=n-1;j++)
{y[j]=c*(x[i+1][j]+y[i-1][j])+c*(x[j+1]+y[j-1]);
z[i][j]=x[i][j]+w*(y[i][j]-x[i][j]);
x[i][j]=y[i][j];
l=max(x[i][j],z[i][j]);
}
}
if(l<epsi)
{for(i=1;i<=n;i++)
{for(j=1;j<=n;j++)
printf("%d z[%d][%d]=\n",k,z[i][j]);
}
}
}
}
错误反馈是这样的:
homework.c:33:1: error: incompatible type for argument 1 of ‘max’
homework.c:4:7: note: expected ‘float (*)[11]’ but argument is of type ‘float’
homework.c:33:1: error: incompatible type for argument 2 of ‘max’
homework.c:4:7: note: expected ‘float (*)[11]’ but argument is of type ‘float’
-
- 帖子: 32
- 注册时间: 2013-04-01 11:42
- 系统: Ubuntu 12.04
- 联系:
Re: c语言函数中如何调用数组
这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: c语言函数中如何调用数组
sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊
-
- 帖子: 32
- 注册时间: 2013-04-01 11:42
- 系统: Ubuntu 12.04
- 联系:
Re: c语言函数中如何调用数组
jinjiachen 写了:sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊
一回事, 你定义的是 max( float x[11][11], float z[11][11] ),这参数本质上就是指向一个一维数组的指针。要类型匹配,调用就用 max( x, y)
而x[j]指的是x数组第i行第j列个元素,就是一个float,
单独的x才是数组。
- reverland
- 帖子: 1317
- 注册时间: 2011-11-26 15:57
- 系统: windows xp
- 联系:
Re: c语言函数中如何调用数组
一般看别人定义操作数组的函数,好像传递参数都是指针。
托在github上的jekyll博客
Always Look on the Bright Side of Life
Always Look on the Bright Side of Life
- cuihao
- 帖子: 4793
- 注册时间: 2008-07-24 11:33
- 来自: 郑州
- 联系:
Re: c语言函数中如何调用数组
二维数组会比较蛋疼。reverland 写了:一般看别人定义操作数组的函数,好像传递参数都是指针。
如果不指定第二维,就没办法在函数里直接当二维数组用。
如果想通用性高一点,我觉得这样定义大概好一点:
代码: 全选
void func (int **ptr, int a); //a是数组第二维
转换代码有点绕,不写了……
求人不如求它仨: 天蓝的Wiki 屎黄的Wiki 蓝红黄蓝绿红
Site: CUIHAO.TK Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
Site: CUIHAO.TK Twitter: @cuihaoleo
Machine: Athlon64 X2 5200+ / 2x2GB DDR2-800 / GeForce GTS 450
AD: ~まだ見ぬ誰かの笑顔のために~
-
- 帖子: 35
- 注册时间: 2009-07-10 16:56
- 系统: ubuntu
Re: c语言函数中如何调用数组
代码: 全选
#include<stdio.h>
#include<math.h>
#define n 10
float max(float x[n+1][n+1],float z[n+1][n+1]) //这里预编译宏替换后参数是 float x[11][11], float z[11][11] 显然是数组(二维指针)
{
int a,b;
float min[n+1][n+1],m=0;
for(a=1; a<=n; a++)
{
for(b=1; b<=n; b++)
{
min[a][b]=z[a][b]-x[a][b];
if(fabs(min[a][b])>m) m=fabs(min[a][b]); // 这里fabs()拼写错误!!
}
}
return(m);
}
int main(void)
{
int i,j,k,it=100,c,w; //参数 w 未初始化!!
float x[n+1][n+1],y[n+1][n+1],z[n+1][n+1],epsi=1e-6,l;
c=1/4;
for(i=1; i<=n; i++)
{
x[1][i]=y[1][i]=0;
x[i][1]=y[i][1]=0;
x[n][i]=y[n][i]=0;
}
for(i=2; i<=n-1; i++)
{
for(j=2; j<=n-1; j++)
{
x[i][j]=1;
}
}
for(k=1; k<it; k++)
{
for(i=2; i<=n-1; i++)
{
for(j=2; j<=n-1; j++)
{
y[i][j]=c*(x[i+1][j]+y[i-1][j])+c*(x[i][j+1]+y[i][j-1]);
z[i][j]=x[i][j]+w*(y[i][j]-x[i][j]);
x[i][j]=y[i][j];
l=max(x,z); //输入参数 x[i][j] 是一个float,看看楼主你自己的max 参数定义,匹配吗?
}
}
if(l<epsi)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%d z[%d][%d]=%f\n",k, i, j, z[i][j]);
}
}
}
}
sokoban 写了:jinjiachen 写了:sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊
max() 两个参数定义是数组,调用时输入的却是 float。
fasb()? 函数fabs拼写错误。
w 参数未初始化,是随机的。
写代码即使是百行内也不要希望一次成功。写代码最好是写一行,就编译/解释执行查看一下对不对,对了再继续。这样子每一次都是在正确的基础上修改,容易发现错误。
这样子改还是不大好...
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: c语言函数中如何调用数组
newzxl 写了:代码: 全选
#include<stdio.h> #include<math.h> #define n 10 float max(float x[n+1][n+1],float z[n+1][n+1]) //这里预编译宏替换后参数是 float x[11][11], float z[11][11] 显然是数组(二维指针) { int a,b; float min[n+1][n+1],m=0; for(a=1; a<=n; a++) { for(b=1; b<=n; b++) { min[a][b]=z[a][b]-x[a][b]; if(fabs(min[a][b])>m) m=fabs(min[a][b]); // 这里fabs()拼写错误!! } } return(m); } int main(void) { int i,j,k,it=100,c,w; //参数 w 未初始化!! float x[n+1][n+1],y[n+1][n+1],z[n+1][n+1],epsi=1e-6,l; c=1/4; for(i=1; i<=n; i++) { x[1][i]=y[1][i]=0; x[i][1]=y[i][1]=0; x[n][i]=y[n][i]=0; } for(i=2; i<=n-1; i++) { for(j=2; j<=n-1; j++) { x[i][j]=1; } } for(k=1; k<it; k++) { for(i=2; i<=n-1; i++) { for(j=2; j<=n-1; j++) { y[i][j]=c*(x[i+1][j]+y[i-1][j])+c*(x[i][j+1]+y[i][j-1]); z[i][j]=x[i][j]+w*(y[i][j]-x[i][j]); x[i][j]=y[i][j]; l=max(x,z); //输入参数 x[i][j] 是一个float,看看楼主你自己的max 参数定义,匹配吗? } } if(l<epsi) { for(i=1; i<=n; i++) { for(j=1; j<=n; j++) printf("%d z[%d][%d]=%f\n",k, i, j, z[i][j]); } } } }
sokoban 写了:jinjiachen 写了:sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊
max() 两个参数定义是数组,调用时输入的却是 float。
fasb()? 函数fabs拼写错误。
w 参数未初始化,是随机的。
写代码即使是百行内也不要希望一次成功。写代码最好是写一行,就编译/解释执行查看一下对不对,对了再继续。这样子每一次都是在正确的基础上修改,容易发现错误。
这样子改还是不大好...
我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累
你的
代码: 全选
l=max(x,z)
-
- 帖子: 35
- 注册时间: 2009-07-10 16:56
- 系统: ubuntu
Re: c语言函数中如何调用数组
max(x,z) 俩参数都是数组啊(应该传的是数组的地址)。jinjiachen 写了: 我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累
你的这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?代码: 全选
l=max(x,z)
改成这样子,可以运行,不知道是不是你要的。
代码: 全选
#include<stdio.h>
#include<math.h>
#define n 10
//float max(float x[n+1][n+1],float z[n+1][n+1])
//{
// int a,b;
// float min[n+1][n+1],m=0;
// for(a=1; a<=n; a++)
// {
// for(b=1; b<=n; b++)
// {
// min[a][b]=z[a][b]-x[a][b];
// if(fabs(min[a][b])>m) m=fabs(min[a][b]);
// }
// }
// return(m);
//}
int main(void)
{
int i,j,k,it=10,c,w=1; //<---你的w没有初始化!!!
float x[n+1][n+1],y[n+1][n+1],z[n+1][n+1],epsi=1e-6,l = 0; // <--这里初始化了一下l。
c=1/4;
for(i=1; i<=n; i++)
{
x[1][i]=y[1][i]=0;
x[i][1]=y[i][1]=0;
x[n][i]=y[n][i]=0;
}
for(i=2; i<=n-1; i++)
{
for(j=2; j<=n-1; j++)
{
x[i][j]=1;
}
}
for(k=1; k<it; k++)
{
for(i=2; i<=n-1; i++)
{
for(j=2; j<=n-1; j++)
{
y[i][j]=c*(x[i+1][j]+y[i-1][j])+c*(x[i][j+1]+y[i][j-1]);
z[i][j]=x[i][j]+w*(y[i][j]-x[i][j]);
x[i][j]=y[i][j];
float delta = fabs(x[i][j] - z[i][j]); //每次直接把最大的delta覆盖到l里边不行吗?
if (delta > l) l = delta;
}
}
if(l<epsi)
{
for(i=1; i<=n; i++)
{
for(j=1; j<=n; j++)
printf("%d z[%d][%d]=%f\n",k, i, j, z[i][j]);
}
}
}
return 0;
}
那个x[j] 和 z[j] 本来就在循环里边,是数组里边 nxn 个元素中的一个,你直接在循环里边比差值就行了,不需要再在max里用多层循环把x[j] 和 z[j] 之前比过的再比较了,浪费资源了。
像这样公式复杂的东西的确比较难 debug。
1)先把 n 定小一点,比如 4。
2)注释掉大部分(最好二分法的方式注释/调试,这样最快,但是不一定能次次二分),别手工注释,太多,vim emacs 不会用的话,codeblocks 吧,或者手工这样子
/*
注释掉也可以,注释一片反正就4个字符。
*/
3)然后单步调试或者在纸上画画。
4)修改完了,反注释掉。
-
- 帖子: 35
- 注册时间: 2009-07-10 16:56
- 系统: ubuntu
Re: c语言函数中如何调用数组
楼主 的 int main 函数忘了 renturn 0;
-
- 帖子: 2148
- 注册时间: 2012-12-16 15:43
- 系统: debian
Re: c语言函数中如何调用数组
newzxl 写了:max(x,z) 俩参数都是数组啊(应该传的是数组的地址)。jinjiachen 写了: 我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累
你的这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?代码: 全选
l=max(x,z)
改成这样子,可以运行,不知道是不是你要的。你的 max 函数貌似不需要。而且你的 max函数 的功能不是求max,你当然会乱。代码: 全选
#include<stdio.h> #include<math.h> #define n 10 //float max(float x[n+1][n+1],float z[n+1][n+1]) //{ // int a,b; // float min[n+1][n+1],m=0; // for(a=1; a<=n; a++) // { // for(b=1; b<=n; b++) // { // min[a][b]=z[a][b]-x[a][b]; // if(fabs(min[a][b])>m) m=fabs(min[a][b]); // } // } // return(m); //} int main(void) { int i,j,k,it=10,c,w=1; //<---你的w没有初始化!!! float x[n+1][n+1],y[n+1][n+1],z[n+1][n+1],epsi=1e-6,l = 0; // <--这里初始化了一下l。 c=1/4; for(i=1; i<=n; i++) { x[1][i]=y[1][i]=0; x[i][1]=y[i][1]=0; x[n][i]=y[n][i]=0; } for(i=2; i<=n-1; i++) { for(j=2; j<=n-1; j++) { x[i][j]=1; } } for(k=1; k<it; k++) { for(i=2; i<=n-1; i++) { for(j=2; j<=n-1; j++) { y[i][j]=c*(x[i+1][j]+y[i-1][j])+c*(x[i][j+1]+y[i][j-1]); z[i][j]=x[i][j]+w*(y[i][j]-x[i][j]); x[i][j]=y[i][j]; float delta = fabs(x[i][j] - z[i][j]); //每次直接把最大的delta覆盖到l里边不行吗? if (delta > l) l = delta; } } if(l<epsi) { for(i=1; i<=n; i++) { for(j=1; j<=n; j++) printf("%d z[%d][%d]=%f\n",k, i, j, z[i][j]); } } } return 0; }
那个x[j] 和 z[j] 本来就在循环里边,是数组里边 nxn 个元素中的一个,你直接在循环里边比差值就行了,不需要再在max里用多层循环把x[j] 和 z[j] 之前比过的再比较了,浪费资源了。
像这样公式复杂的东西的确比较难 debug。
1)先把 n 定小一点,比如 4。
2)注释掉大部分(最好二分法的方式注释/调试,这样最快,但是不一定能次次二分),别手工注释,太多,vim emacs 不会用的话,codeblocks 吧,或者手工这样子
/*
注释掉也可以,注释一片反正就4个字符。
*/
3)然后单步调试或者在纸上画画。
4)修改完了,反注释掉。
真是非常感谢你,教了我许多,还有一些好习惯,我是用vim编的,请问你是用什么编的?感觉它会自己排版啊,就和visual c一样,是emacs ?