C ++奇怪的错误,“没有从'int'转换为'int(__ cdecl *)(float,float)'”

时间:2011-02-23 02:59:10

标签: c++

首先,这是我关于stackoverflow的第一个问题。我正在努力完成一项家庭作业,但我不知道自己可能做错了什么。

当我尝试第二次运行一个函数时,我收到一个错误,“没有从'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);
 }

6 个答案:

答案 0 :(得分:3)

您希望将函数的返回值与0进行比较:

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

尝试做:

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

函数weight也没有返回任何内容。修复。

如果你试图将两个浮点数与==进行比较,请注意浮点不准确性。

答案 1 :(得分:2)

上面的每个人都是正确的,但让我们来谈谈错误信息告诉你的内容。

正如您所知,

weigh是一个需要两个float并返回int的函数。

因此。调用weigh时获得的值为int。所以你的基本想法是正确的。

Hwever,当你写if(weigh == 0)时,你遗漏了一个重要的部分,()。这是C / C ++中用于调用函数的语法。 weigh,然后只是函数的名称,它与“地址”相同。 C / C ++中函数的全名包含参数,因此函数的全名实际上是

  • C风格的函数_cdecl
  • 返回int
  • 取两个参数(float, float)

并且符号weigh是该函数的地址,出于复杂的原因,我想您还没有看到,将weigh的完整类型转换为{ {1}}。

所以错误信息所说的是“整数比较应该在两个int(_cdecl*)(float,float)之间,但你给我的是一个int和一个带有两个浮点参数的函数的地址返回一个int。我太傻了,无法理解。“

答案 2 :(得分:1)

问题在于:

if(weigh == 0)

您尝试将函数weigh与零进行比较,而不是比较包含返回值的变量。

答案 3 :(得分:0)

这是怎么回事:

if(weigh == 0)

为什么要将函数与0进行比较?

我认为你真的应该做的是

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

接下来解决您的逻辑问题

你正试图找到重量最轻的石头。 你应该使用的是排序。由于您不熟悉此C语言阅读this article

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

答案 4 :(得分:0)

if(称重== 0) 您试图将函数的地址(函数的名称作为左值)与零

进行比较

称重== 0永远不会是真的,因为你定义了权重。

我相信这就是你想要的:

int result = weigh(first_leftpan,first_rightpan) if(result == 0)

答案 5 :(得分:0)

比较

(weigh == 0)

将函数指针与整数进行比较。错误显示在第二个实例而不是第一个实例上的原因是编译器的工件。我相当肯定,如果你注释掉给你错误的那一行,你会在第一行得到类似的错误。 (虽然有些编译器可能会隐式地将0转换为指针并允许比较...在这种情况下,您可能会因为错过右括号而看到错误?)

无论如何,看起来你想要比较调用的结果,在这种情况下你应该捕获返回值并在比较中使用它。

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