2017-02-14 379 views
0

作爲一項任務,我必須編寫一個接受用戶輸入的代碼,並對它們執行操作,然後將它們打印到屏幕上。但是,我不斷收到第18行的錯誤信息,其中我稱FunctionMultiply爲函數不能將'double(_cdecl *)()'轉換爲'double'。我搜索了這種類型的問題,但似乎所有這些都與我的代碼中沒有的數組有關。我怎樣才能解決這個問題?無法將'double(_cdecl *)()'轉換爲'double'

#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; 
    } 
} 
+0

FunctionCharacter(GetLetter()); –

+0

[mcve]會更容易 – anatolyg

回答

1

看起來你並沒有注意顯示如何使用函數的課程或例子。

GetInt(); 

這調用GetInt函數,並忽略它的返回值。

GetDouble(); 

這調用GetDouble函數,並忽略它的返回值。

GetLetter(); 

這稱爲GetLetter函數,並且...您現在知道得分。

FunctionMultiply(GetInt, GetDouble); 

這只是無稽之談。您正試圖調用FunctionMultiply函數,將函數GetIntGetDouble作爲參數傳遞。您需要通過它intdouble,但您沒有intdouble,因爲您沒有將結果GetIntGetDouble存儲在任何地方。

你應該這樣做:

int i = GetInt(); 
double d = GetDouble(); 
char l = GetLetter(); 

現在你有變量idl持有這些函數調用的結果,這樣你就可以在其它功能通過他們:

FunctionCharacter(i, d); 
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 
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); 
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()