作为编码的初学者,我正在为我的C考试做准备并正在做一个练习,我必须编写一个应该计算sinh x的程序......当我以正常的方式写作时,它正常工作并计算出正确的答案,但是当我将我的功能从Call by value更改为Call by reference时,我得到了一个错误"无法将参数1从double转换为float" ...为什么我得到了它,我什么时候才能考虑用那个值? 在这里你可以看到我的代码:)
#include "stdafx.h"
#include "math.h"
#include "iostream"
float e=2.71828;
using namespace std;
float sinhyp (float *x)
{
return (0.5*(pow(e,*x)-pow(e,(-1)*(*x))));
}
int _tmain(void)
{
float erg=sinhyp(15.0);
printf("%f \n", erg);
system ("Pause");
return 0;
}
感谢您的建议/帮助;)
答案 0 :(得分:6)
C没有通过引用打电话。将函数参数的类型从float
更改为float *
时,必须更改调用者以匹配。你的函数现在需要一个指针,所以你必须提供一个指针。例如,此调用可以起作用:
float fifteen = 15.0;
float erg=sinhyp(&fifteen);
&
运算符是关键。它生成一个指针值,指向包含值15.0
的变量。
答案 1 :(得分:1)
15.0是双常数。
尝试将其设为浮点常量
<强> 15.0f 强>
答案 2 :(得分:1)
您的功能期待float *
,但您传递double
。你不能用这种方式在指针和值之间进行转换。
由于您的功能实际上并未改变传入的值,因此您不需要指针。然后,15.0
的值double
可以安全地转换为float
:
float sinhyp (float x)
{
return (0.5*(pow(e,x)-pow(e,(-1)*(x))));
}
答案 3 :(得分:1)
float sinhyp (float *x)
不是引用的传递。它通过值传递float *
或pointer to float。
要通过引用传递,请使用&
。
// float sinhyp (float *x) {
float sinhyp (float &x) {
// return (0.5*(pow(e,*x)-pow(e,(-1)*(*x))));
return (0.5*(pow(e,x)-pow(e,(-1)*(x))));
}
使用匹配类型
进行调用 // float erg=sinhyp(15.0);
float erg=sinhyp(15.0f);