分页: 1 / 1
c语言函数中如何调用数组
发表于 : 2013-04-18 17:39
由 jinjiachen
这是我编的一个松驰法迭代的一个算例,想用函数调用数组,可是总是出错,比如定义函数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’
Re: c语言函数中如何调用数组
发表于 : 2013-04-18 17:46
由 sokoban
这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
Re: c语言函数中如何调用数组
发表于 : 2013-04-18 17:49
由 jinjiachen
sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。
实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊
Re: c语言函数中如何调用数组
发表于 : 2013-04-18 17:54
由 sokoban
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才是数组。
Re: c语言函数中如何调用数组
发表于 : 2013-04-18 23:06
由 reverland
一般看别人定义操作数组的函数,好像传递参数都是指针。
Re: c语言函数中如何调用数组
发表于 : 2013-04-18 23:19
由 cuihao
reverland 写了:一般看别人定义操作数组的函数,好像传递参数都是指针。
二维数组会比较蛋疼。
如果不指定第二维,就没办法在函数里直接当二维数组用。
如果想通用性高一点,我觉得这样定义大概好一点:
代码: 全选
void func (int **ptr, int a); //a是数组第二维
然后下面再强制类型转换……
转换代码有点绕,不写了……
Re: c语言函数中如何调用数组
发表于 : 2013-04-19 0:37
由 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 参数未初始化,是随机的。
写代码即使是百行内也不要希望一次成功。写代码最好是写一行,就编译/解释执行查看一下对不对,对了再继续。这样子每一次都是在正确的基础上修改,容易发现错误。
这样子改还是不大好...
Re: c语言函数中如何调用数组
发表于 : 2013-04-19 13:10
由 jinjiachen
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 参数未初始化,是随机的。
写代码即使是百行内也不要希望一次成功。写代码最好是写一行,就编译/解释执行查看一下对不对,对了再继续。这样子每一次都是在正确的基础上修改,容易发现错误。
这样子改还是不大好...
我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累
你的这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?
Re: c语言函数中如何调用数组
发表于 : 2013-04-19 17:37
由 newzxl
jinjiachen 写了:
我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累
你的
这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?
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;
}
你的 max 函数貌似不需要。而且你的 max函数 的功能不是求max,你当然会乱。
那个x
[j] 和 z[j] 本来就在循环里边,是数组里边 nxn 个元素中的一个,你直接在循环里边比差值就行了,不需要再在max里用多层循环把x[j] 和 z[j] 之前比过的再比较了,浪费资源了。
像这样公式复杂的东西的确比较难 debug。
1)先把 n 定小一点,比如 4。
2)注释掉大部分(最好二分法的方式注释/调试,这样最快,但是不一定能次次二分),别手工注释,太多,vim emacs 不会用的话,codeblocks 吧,或者手工这样子
/*
注释掉也可以,注释一片反正就4个字符。
*/
3)然后单步调试或者在纸上画画。
4)修改完了,反注释掉。
Re: c语言函数中如何调用数组
发表于 : 2013-04-19 18:09
由 newzxl
楼主 的 int main 函数忘了 renturn 0;
Re: c语言函数中如何调用数组
发表于 : 2013-04-19 21:45
由 jinjiachen
newzxl 写了:jinjiachen 写了:
我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累
你的
这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?
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;
}
你的 max 函数貌似不需要。而且你的 max函数 的功能不是求max,你当然会乱。
那个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 ?