C语言,关于函数的形参实参的小问题

C语言 码拜 9年前 (2015-05-11) 953次浏览 0个评论
 

直接上代码
/////////////////////////

static short data3[65536][128];//复原的数据
	static short data4[65536][128];//原有数据
	int wave=56;
	static double sum=0;
	double SNR;
SNR=ErrorCalculate(data3,data4,wave,sum);
printf("SNR=%lf\nsum,mutiplied 10^3 times then printf=%lf\n",SNR,(sum*pow((double)10,3)));

///////////////

#include "stdafx.h"
#include "ErrorCalculate.h"

double ErrorCalculate(short a[65536][128],short b[65536][128],int wave,static double sum)
{

	double SNR=0;
	for (int i = 0; i < 65536; i++)
	{
		sum+=(a[i][wave]-b[i][wave])*(a[i][wave]-b[i][wave]);
	}
	sum=sum/65536;//sum是均方值
	SNR = 10*log10((255*255) /sum );
	return SNR;
}

//////
这个代码,返回值SNR是对的,可是我明明声明了SUM为STATIC为何,其值依然是0?
我希望sum能保存函数内部计算的结果。。。
楼主小白,请指教一下。。。

5分
sum=sum/65536;//sum是均方值
有可能是上一步计算完,sum的值就是0吧。
5分

SNR=ErrorCalculate(data3,data4,wave,&sum);
 
double ErrorCalculate(short a[65536][128],short b[65536][128],int wave,static double * sum)
{
    double sum_tmp = 0; 
    double SNR=0;
    for (int i = 0; i < 65536; i++)
    {
        sum_tmp+=(a[i][wave]-b[i][wave])*(a[i][wave]-b[i][wave]);
    }
    sum_tmp=sum_tmp/65536;//sum_tmp是均方值
    SNR = 10*log10((255*255) /sum_tmp );
    *sum = sum_tmp;
    return SNR;
}
 short data3[65536][128]

栈上的也这么大??

5分
代码的计算逻辑没有细看,有以下意见可供参考:
1. 从你贴出的代码和你描述的需求上看,这里没有必要使用static
2. 当sum传入ErrorCalculate函数时,ErrorCalculate函数中得sum参数实际时你传入的sum的一个拷贝,所以函数中无论怎样操作sum,在函数结束后你再输出sum,结果都会时函数处理前的值。
3. 如果你希望函数执行后sum值有变化:(1)直接用返回值去赋值;(2)传入sum的指针,对指针进行操作。
传值调用与传址调用
5分
我是这样理解的,你有一个静态全局的sum,有一个静态局部的sum。调用ErrorCaculate时,全局的sum值给了局部的sum,操作的也是这个静态局部sum,调用返回时,静态局部sum虽然还在,但出了访问范围了。此时你输出的应是静态全局那个sum,此值并没有变化。
5分
形参sum得到的是实参sum的值
函数中形参的值改变了
返回后形参没了
原sum还是原值

形参应该为指针
传sum的地址

引用 4 楼 wsdhren 的回复:

代码的计算逻辑没有细看,有以下意见可供参考:
1. 从你贴出的代码和你描述的需求上看,这里没有必要使用static
2. 当sum传入ErrorCalculate函数时,ErrorCalculate函数中得sum参数实际时你传入的sum的一个拷贝,所以函数中无论怎样操作sum,在函数结束后你再输出sum,结果都会时函数处理前的值。
3. 如果你希望函数执行后sum值有变化:(1)直接用返回值去赋值;(2)传入sum的指针,对指针进行操作。

之前传入了数组形参,把自己误导了。其实数组也是指针。我明白了,非常感谢。

顺便问一下,把sum声明为 enternal 有用么?

5分
最后一个形参你得设置成引用,设置成引用,就是对对象本身的操作,会改变对象本身,你传值,只是对它的副本进行操作,sum当然是0
前面几个楼说的很对,值传递 地址传递的区别吧

———————
怎么总是会邀请回答呢?不是那么多人回答过了吗

5分
你应该把

static double sum=0;

声明为全局的
并且ErrorCalculate()不必使用double sum这一参数

5分
如果变量声明是全局的话,data3没有必要作为实参传递,应该把函数中的形参删掉
如果你的data3不是全局变量,在进入ErrorCalculate函数时候会把data3当做short类型的数组,所以才会有上面的结果
其实你可以用指针啊,形参声明数组多麻烦啊。

double ErrorCalculate(short *a,short *b,int wave,double * sum)

改成上面的形式试一试,调用地方一样。没有编译器就不帮你调试了。

static double sum=0; 把它放在ErrorCalculate() 中  然后去掉double sum这一参数!
一个小问题都有这么多人回答,实在是感谢。
分数有限,人人都有

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C语言,关于函数的形参实参的小问题
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!