直接上代码 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; } ////// |
|
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声明为 enternal 有用么? |
|
5分 |
最后一个形参你得设置成引用,设置成引用,就是对对象本身的操作,会改变对象本身,你传值,只是对它的副本进行操作,sum当然是0
|
前面几个楼说的很对,值传递 地址传递的区别吧
——————— |
|
5分 |
你应该把
static double sum=0; 声明为全局的 |
5分 |
如果变量声明是全局的话,data3没有必要作为实参传递,应该把函数中的形参删掉
如果你的data3不是全局变量,在进入ErrorCalculate函数时候会把data3当做short类型的数组,所以才会有上面的结果 其实你可以用指针啊,形参声明数组多麻烦啊。 double ErrorCalculate(short *a,short *b,int wave,double * sum) 改成上面的形式试一试,调用地方一样。没有编译器就不帮你调试了。 |
static double sum=0; 把它放在ErrorCalculate() 中 然后去掉double sum这一参数!
|
|
一个小问题都有这么多人回答,实在是感谢。
分数有限,人人都有 |