2017-02-14 11 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); 

これは単なるナンセンスです。関数GetIntGetDoubleを引数として渡して、FunctionMultiply関数を呼び出そうとしています。 intdoubleを渡す必要がありますが、GetIntGetDoubleの結果をどこにも保存していないため、intdoubleがありません。

あなたはこの行っている必要があります。

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

のように読んでください。あなたはちょうど始めに機能の束を呼び、結果に何も格納されていません。

関数識別子を単独で使用すると、その関数の最後の呼び出しの結果が返されます。しかし、それはしません。このようなあなたのmain()を変更

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

を:あなたは、戻り値を格納し、後でそれらを使用する方法をここで

がある

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となります。

関連する問題