当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 11 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : c语言函数中如何调用数组
帖子发表于 : 2013-04-18 17:39 

注册: 2012-12-16 15:43
帖子: 2074
系统: debian
送出感谢: 8
接收感谢: 28
这是我编的一个松驰法迭代的一个算例,想用函数调用数组,可是总是出错,比如定义函数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][b]=z[a][b]-x[a][b];
if(fasb(min[a][b])>m) m=fabs(min[a][b]);}
}
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][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[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’


页首
 用户资料  
 
2 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-18 17:46 

注册: 2013-04-01 11:42
帖子: 32
系统: Ubuntu 12.04
送出感谢: 2
接收感谢: 1
这是c语言问题啊,和ubuntu没有多大关系。

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


_________________
http://sokoban.cn


页首
 用户资料  
 
3 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-18 17:49 

注册: 2012-12-16 15:43
帖子: 2074
系统: debian
送出感谢: 8
接收感谢: 28
sokoban 写道:
这是c语言问题啊,和ubuntu没有多大关系。

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


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


页首
 用户资料  
 
4 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-18 17:54 

注册: 2013-04-01 11:42
帖子: 32
系统: Ubuntu 12.04
送出感谢: 2
接收感谢: 1
jinjiachen 写道:
sokoban 写道:
这是c语言问题啊,和ubuntu没有多大关系。

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


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



一回事, 你定义的是 max( float x[11][11], float z[11][11] ),这参数本质上就是指向一个一维数组的指针。要类型匹配,调用就用 max( x, y)
而x[i][j]指的是x数组第i行第j列个元素,就是一个float,
单独的x才是数组。


_________________
http://sokoban.cn


页首
 用户资料  
 
5 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-18 23:06 
头像

注册: 2011-11-26 15:57
帖子: 1317
系统: windows xp
送出感谢: 31
接收感谢: 13
一般看别人定义操作数组的函数,好像传递参数都是指针。 :em11


_________________
托在github上的jekyll博客
Always Look on the Bright Side of Life


页首
 用户资料  
 
6 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-18 23:19 
头像

注册: 2008-07-24 11:33
帖子: 4793
地址: 郑州
送出感谢: 4
接收感谢: 92
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: ~まだ見ぬ誰かの笑顔のために~


页首
 用户资料  
 
7 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-19 0:37 

注册: 2009-07-10 16:56
帖子: 35
系统: ubuntu
送出感谢: 0 次
接收感谢: 3
代码:
#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[i][j] 就是一个float,而max函数期待的是 float (*)[11]


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


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

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

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


页首
 用户资料  
 
8 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-19 13:10 

注册: 2012-12-16 15:43
帖子: 2074
系统: debian
送出感谢: 8
接收感谢: 28
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[i][j] 就是一个float,而max函数期待的是 float (*)[11]


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


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

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

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

我是先写好,然后再输代码的。。。感觉对着电脑想,脑子转不起来。。。而且累 :em06
你的
代码:
l=max(x,z)
这里的xz是调用的数组吗?也就是调用时只要数组名就可以了?


页首
 用户资料  
 
9 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-19 17:37 

注册: 2009-07-10 16:56
帖子: 35
系统: ubuntu
送出感谢: 0 次
接收感谢: 3
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[i][j] 和 z[i][j] 本来就在循环里边,是数组里边 nxn 个元素中的一个,你直接在循环里边比差值就行了,不需要再在max里用多层循环把x[i][j] 和 z[i][j] 之前比过的再比较了,浪费资源了。


像这样公式复杂的东西的确比较难 debug。
1)先把 n 定小一点,比如 4。
2)注释掉大部分(最好二分法的方式注释/调试,这样最快,但是不一定能次次二分),别手工注释,太多,vim emacs 不会用的话,codeblocks 吧,或者手工这样子
/*
注释掉也可以,注释一片反正就4个字符。
*/
3)然后单步调试或者在纸上画画。
4)修改完了,反注释掉。



_________________
评价: 3.7% jinjiachen
 
页首
 用户资料  
 
10 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-19 18:09 

注册: 2009-07-10 16:56
帖子: 35
系统: ubuntu
送出感谢: 0 次
接收感谢: 3
楼主 的 int main 函数忘了 renturn 0;


页首
 用户资料  
 
11 楼 
 文章标题 : Re: c语言函数中如何调用数组
帖子发表于 : 2013-04-19 21:45 

注册: 2012-12-16 15:43
帖子: 2074
系统: debian
送出感谢: 8
接收感谢: 28
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[i][j] 和 z[i][j] 本来就在循环里边,是数组里边 nxn 个元素中的一个,你直接在循环里边比差值就行了,不需要再在max里用多层循环把x[i][j] 和 z[i][j] 之前比过的再比较了,浪费资源了。


像这样公式复杂的东西的确比较难 debug。
1)先把 n 定小一点,比如 4。
2)注释掉大部分(最好二分法的方式注释/调试,这样最快,但是不一定能次次二分),别手工注释,太多,vim emacs 不会用的话,codeblocks 吧,或者手工这样子
/*
注释掉也可以,注释一片反正就4个字符。
*/
3)然后单步调试或者在纸上画画。
4)修改完了,反注释掉。

真是非常感谢你,教了我许多,还有一些好习惯,我是用vim编的,请问你是用什么编的?感觉它会自己排版啊,就和visual c一样,是emacs ?


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 11 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 3 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译