无法转换' double(_cdecl *)()'到'加倍

时间:2017-02-14 00:17:33

标签: c++

作为一项任务,我必须编写一个代码,该代码接受用户输入,对它们执行操作,然后将它们打印到屏幕上。但是,我继续在第18行收到错误,我在其中调用FunctionMultiply,说该函数无法转换' double(_cdecl *)()'到'加倍我搜索了这种类型的问题,但似乎所有这些都与我的代码中没有的数组有关。我该如何解决这个问题?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <ctype.h>

int GetInt(void);
double GetDouble();
char GetLetter(void);
double FunctionMultiply(int, double);
int FunctionCharacter(char);

int main()
{
    GetInt();
    GetDouble();
    GetLetter();
    FunctionMultiply(GetInt, GetDouble);
    FunctionCharacter(GetLetter);
    printf("%f", FunctionMultiply);
    printf("%c", FunctionCharacter);
    return 0;
}

int GetInt(void)
{
    int integer;
    printf("Enter an integer\n");
    scanf("%i", &integer);
    return integer;
}

double GetDouble()
{
    double dub;
    printf("Enter a floating point number\n");
    scanf(" %lf", &dub);
    return dub;
}

char GetLetter(void)
{
    char letter;
    printf("Enter a letter\n");
    scanf(" %c", &letter);
    return letter;
}


double FunctionMultiply(int arg1, double arg2)
{
    double product = arg1 * arg2;
    return product;
}

int FunctionCharacter(char letter)
{
    if (toupper(letter) <= 'M')
    {
        return 0;
    }
    else
    {
    return 1;
    }
}

4 个答案:

答案 0 :(得分:4)

我认为您将功能标识符与存储混淆。您刚开始调用了一堆函数,而不是将结果存储在任何函数中。

似乎您希望自己使用函数标识符将为您提供上次调用该函数的结果。但事实并非如此。

以下是存储返回值并稍后使用它们的方法:

int my_int = GetInt();
double my_double = GetDouble();
char my_char = GetLetter();

double multiply_result = FunctionMultiply( my_int, my_double );
char char_result = FunctionCharacter( my_char );

printf( "%f", multiply_result );
printf( "%c", char_result );

答案 1 :(得分:2)

像这样修改你的main()

int main()
{
    int i = GetInt();
    double d = GetDouble();
    char c = GetLetter();
    double a = FunctionMultiply(i, d);
    char c = FunctionCharacter(c);
    printf("%f", a);
    printf("%c", c);
    return 0;
}

您的问题是您传递的是函数名称而不是调用它们。即GetInt而不是GetInt()

答案 2 :(得分:1)

看起来您没有注意显示如何使用功能的课程或示例。

GetInt();

这将调用GetInt函数,并忽略其返回值。

GetDouble();

这将调用GetDouble函数,并忽略其返回值。

GetLetter();

这会调用GetLetter函数,并且......您现在知道得分。

FunctionMultiply(GetInt, GetDouble);

这只是胡说八道。您正在尝试调用FunctionMultiply函数,将函数GetIntGetDouble作为参数传递。您需要传递intdouble,但是您没有intdouble,因为您没有存储{{1}的结果和GetInt任何地方。

你应该这样做:

GetDouble

现在您拥有保存这些函数调用结果的变量int i = GetInt(); double d = GetDouble(); char l = GetLetter(); id,因此您可以将它们传递给其他函数:

l

答案 3 :(得分:1)

在您调用该函数一次之后,您似乎认为函数的名称会神奇地更改为调用的结果。

没有。函数调用表达式本身就是调用的结果。

而不是

ReturnADouble();
//  call ^  and  value v somehow separated?  Why did you ever think that?
double result = ReturnADouble;

但是根据语言规则,ReturnADouble仍然是函数的名称,当你给出一个函数的名称时,编译器会正确地抱怨你应该给出一个数值。

您的代码应该更像

double result = ReturnADouble();
             // ^ this call results in a value