c语言函数中如何调用数组

系统安装、升级讨论
版面规则
我们都知道新人的确很菜,也喜欢抱怨,并且带有浓厚的Windows习惯,但既然在这里询问,我们就应该有责任帮助他们解决问题,而不是直接泼冷水、简单的否定或发表对解决问题没有任何帮助的帖子。乐于分享,以人为本,这正是Ubuntu的精神所在。
回复
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

c语言函数中如何调用数组

#1

帖子 jinjiachen » 2013-04-18 17:39

这是我编的一个松驰法迭代的一个算例,想用函数调用数组,可是总是出错,比如定义函数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’
sokoban
帖子: 32
注册时间: 2013-04-01 11:42
系统: Ubuntu 12.04
联系:

Re: c语言函数中如何调用数组

#2

帖子 sokoban » 2013-04-18 17:46

这是c语言问题啊,和ubuntu没有多大关系。

实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: c语言函数中如何调用数组

#3

帖子 jinjiachen » 2013-04-18 17:49

sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。

实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]


float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊 :em20
sokoban
帖子: 32
注册时间: 2013-04-01 11:42
系统: Ubuntu 12.04
联系:

Re: c语言函数中如何调用数组

#4

帖子 sokoban » 2013-04-18 17:54

jinjiachen 写了:
sokoban 写了:这是c语言问题啊,和ubuntu没有多大关系。

实际传递的参数类型不匹配啊。你传的 x[j] 就是一个float,而max函数期待的是 float (*)[11]


float (*)[11]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊 :em20



一回事, 你定义的是 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语言函数中如何调用数组

#5

帖子 reverland » 2013-04-18 23:06

一般看别人定义操作数组的函数,好像传递参数都是指针。 :em11
托在github上的jekyll博客
Always Look on the Bright Side of Life
头像
cuihao
帖子: 4793
注册时间: 2008-07-24 11:33
来自: 郑州
联系:

Re: c语言函数中如何调用数组

#6

帖子 cuihao » 2013-04-18 23:19

reverland 写了:一般看别人定义操作数组的函数,好像传递参数都是指针。 :em11
:em20 二维数组会比较蛋疼。
如果不指定第二维,就没办法在函数里直接当二维数组用。

如果想通用性高一点,我觉得这样定义大概好一点:

代码: 全选

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: ~まだ見ぬ誰かの笑顔のために~
newzxl
帖子: 35
注册时间: 2009-07-10 16:56
系统: ubuntu

Re: c语言函数中如何调用数组

#7

帖子 newzxl » 2013-04-19 0:37

代码: 全选

#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]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊 :em20


max() 两个参数定义是数组,调用时输入的却是 float。
fasb()? 函数fabs拼写错误。
w 参数未初始化,是随机的。

写代码即使是百行内也不要希望一次成功。写代码最好是写一行,就编译/解释执行查看一下对不对,对了再继续。这样子每一次都是在正确的基础上修改,容易发现错误。

这样子改还是不大好...
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: c语言函数中如何调用数组

#8

帖子 jinjiachen » 2013-04-19 13:10

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]这是什么?是指针吗?为什么会不匹配啊?我定义的时候都是数组啊 :em20


max() 两个参数定义是数组,调用时输入的却是 float。
fasb()? 函数fabs拼写错误。
w 参数未初始化,是随机的。

写代码即使是百行内也不要希望一次成功。写代码最好是写一行,就编译/解释执行查看一下对不对,对了再继续。这样子每一次都是在正确的基础上修改,容易发现错误。

这样子改还是不大好...

我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累 :em06
你的

代码: 全选

l=max(x,z)
这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?
newzxl
帖子: 35
注册时间: 2009-07-10 16:56
系统: ubuntu

Re: c语言函数中如何调用数组

#9

帖子 newzxl » 2013-04-19 17:37

jinjiachen 写了: 我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累 :em06
你的

代码: 全选

l=max(x,z)
这里的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)修改完了,反注释掉。
newzxl
帖子: 35
注册时间: 2009-07-10 16:56
系统: ubuntu

Re: c语言函数中如何调用数组

#10

帖子 newzxl » 2013-04-19 18:09

楼主 的 int main 函数忘了 renturn 0;
jinjiachen
帖子: 2148
注册时间: 2012-12-16 15:43
系统: debian

Re: c语言函数中如何调用数组

#11

帖子 jinjiachen » 2013-04-19 21:45

newzxl 写了:
jinjiachen 写了: 我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累 :em06
你的

代码: 全选

l=max(x,z)
这里的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 ?
回复