2011-02-23 54 views
1

首先这是我在stackoverflow上的第一个问题。我正在努力完成一项家庭作业,但我不知道我可能会做错什么。C++奇怪的错误,“没有从'int'转换为'int(__cdecl *)(float,float)'”

当我尝试第二次运行某个函数时,出现错误“无法从'int'转换为'int(__cdecl *)(float,float)''”。该函数应该返回0,-1或+1,并在if/else语句中使用。

这里的代码,我指的是块...

#include <iostream> 
using namespace std; 


////this function returns a -1 if the left pan has a weight more than the right, a 0 if the weights of the two pans are equal, and a +1 if the right pan has a greater weight than the left 
int weigh(float leftpan, float rightpan) 
{ 
//compare the pan weights, return value 
} 


float findOddRock(float r1, float r2, float r3, float r4, float r5, float r6, float r7) 
{ 
    //first weigh 
    float first_leftpan = r1 + r2; 
    float first_rightpan = r3 + r4; 

    weigh(first_leftpan, first_rightpan); 
    if(weigh == 0){ 
     cout << "this program is working so far"; 
     float second_leftpan = r5; //this brings up an error for some reason 
     float second_rightpan = r6; 
     weigh(second_leftpan, second_rightpan); 


//here's where I get the error, no conversion from 'int' to 'int (__cdecl *)(float,float)' 
     if(weigh == 0){ //be careful here, changed from second_weigh to weigh 
      float third_leftpan = r5; 
      float third_rightpan = r7; 
      weigh(third_leftpan, third_rightpan); 
} 

// 
int main() 
{ 
//find the light rock 
findOddRock(2.0, 2.0, 2.0, 2.0, 2.0, 2.0, 1.0); 
} 

回答

0

怎么了这一点:

if(weigh == 0) 

你为什么比较0的功能?

我觉得你真的打算做的是

if(0 == weigh(blah, blah)) 

下一页为您解决问题的逻辑

你正在努力寻找用最少的重石头。 你应该使用的是排序。由于你是这个C的新手,请阅读this article

创建一个函数,对浮点数组进行排序。最低的元素(或升序数组中的第一个元素)是奇怪的石头。

1

的问题是在这里:

if(weigh == 0) 

你试图功能比较weigh到零,而不是比较包含返回值的变量。

+0

我接受了建议,现在程序运行了,但findOddRock不返回任何我包含的字符串。阻止它返回任何字符串的函数有什么问题? – Charli

3

看起来像你想的函数的返回值进行比较,以0

weigh(first_leftpan, first_rightpan); 
    if(weigh == 0){ 

尝试做:

if(weigh(first_leftpan, first_rightpan) == 0){ 

而且功能weight没有返回anything..fix说。

如果您试图比较两个浮点数与==请注意浮点不准确性。

+0

我没有把整个称重功能放在那里,只是为了简洁,但我确实设置了返回值。 编辑:那么关于浮点不准确性的整个事情呢? – Charli

+0

@Charli你正在比较一个float到一个int。这意味着在比较中不考虑小数点后的任何内容。你想要做的是将浮点变量与浮点数进行比较。 – Reno

+0

如何更改函数以便它返回一些内容?我想返回字符串,只是说哪个摇滚是奇怪的,它的重量是多少。 – Charli

0

与IF(重== 0) 你想一个函数(函数作为左值的名称)的地址与零

权衡== 0永远是真实的,因为你有定义重量。

我相信这是你想要什么:

INT结果=体重(first_leftpan,first_rightpan) 如果(结果== 0)

+0

这不是函数的地址。 'int(* func)(float,float)=权重;'是函数的地址。 – Marlon

0

比较

(weigh == 0) 

被比较的功能指向一个整数的指针。错误显示在第二个实例而不是第一个的原因是编译器的工件。我相当肯定,如果你评论给出错误的那一行,你会在第一个错误中得到类似的错误。 (尽管有些编译器可能会将0隐式转换为指针并允许进行比较......在这种情况下,您可能会看到由于缺少右括号而导致的错误?)

无论如何,它看起来像是想要比较在这种情况下,您应该获取返回值并将其用于比较中。

int ret = weigh(first_leftpan, first_rightpan); 
if(ret == 0){ 
... 
2

上面的每个人都是正确的,但让我们来谈谈错误信息告诉你什么。如您所知,

weigh是一个函数,它需要两个float s并返回一个int

所以。您从weigh获得的价值是int。所以你的基本想法是正确的。

Hwever,当您写下if(weigh == 0)时,您遗漏了一个重要部分()。这是C/C++中调用函数的语法。 weigh,那么它就是这个函数的名字,和它的“地址”一样。在C/C函数++包括参数,所以该功能的全名的全称是真的

  • C风格的功能_cdecl
  • 返回一个int
  • 采取两个参数(float, float)

和符号weigh地址该功能,由于复杂的原因,我想你还没有看到,使整个类型的weigh分成int(_cdecl*)(float,float)

那么什么错误消息说的是“整数的比较应该是两个int秒之间,但你给我的是一个int和功能的两个浮子参数返回int地址。这一点我”太愚蠢了,不明白。“

+0

这真的很有帮助。非常感谢! – Charli