2013-02-16 2 views
0

Я новичок в программировании, и сегодня я начал использовать функции. Когда я пытаюсь скомпилировать код, который я делат этого сообщения об ошибке:C++: невозможно преобразовать 'float (*)()' в 'float'

34|error: cannot convert 'float (*)()' to 'float' for argument '1' to 'float calculator(float, float, char)'|

Где проблема?

#include <iostream> 
using namespace std; 

//Insert number 
float ins_num(){ 
    float num; 
    cout<<"Insert a number: "; 
    cin>>num; 
    return num; 
} 

//Insert operator 
char ins_oper(){ 
    char oper; 
    do{ 
     cout<<"Insert the operator: "; 
     cin>>oper; 
    } 
    while(oper!='+'&&oper!='-'&&oper!='*'&&oper!='/'); 
    return oper; 
} 

//Calculator 
float calculator(float n1,float n2,char oper){ 
    switch(oper){ 
     case '+':return n1+n2; 
     case '-':return n1-n2; 
     case '*':return n1*n2; 
     case '/':return n1/n2; 
    } 
} 

int main(){ 
calculator(ins_num,ins_num,ins_oper); 
} 
+8

Должен быть 'calculator (ins_num(), ins_num(), ins_oper());' –

+0

Какая строка дает эту ошибку? –

+0

@ AndyProwl должен быть опубликован как ответ. – Axel

ответ

3
calculator(ins_num, ins_num, ins_oper); 

Это вызывает функцию calculator() с функциями ins_num и ins_operсами в качестве аргументов (из которых тип float (*)() и char (*)(), указатель на функцию, возвращающую float или char, соответственно, и принимая нет аргументов). Вы этого не хотите. Вы хотите, чтобы вызвать calculator() функцию со значением возврата других функций, так что вы должны вызов те также:

calculator(ins_num(), ins_num(), ins_oper()); 

И вот some food for thought на указатели на функции.

+0

Я не знал об этом, спасибо за ваше время! – Bonfi

1

Для выполнения кода в функции вам необходимо использовать то, что программисты называют вызовом функции . В C++ мы делаем это с помощью круглых скобок. Так, по крайней мере, вам необходимо изменить

calculator(ins_num,ins_num,ins_oper); 

в

calculator(ins_num(),ins_num(),ins_oper()); 

Вы должны быть осторожными, хотя. На мой взгляд, вы делаете слишком много в этой единственной строке кода. Я предлагаю вам разделить его на несколько строк:

float lhs = ins_num(); // "lhs" is a common mathematical abbreviation for "left hand side" 
float rhs = ins_num(); // "rhs" is a common mathematical abbreviation for "right hand side" 
char oper = ins_oper(); 

calculator(lhs, rhs, oper); 

Основная причина этого в том, что это поможет вам отследить ошибки, как ваши программы становятся все более сложными.

+0

Спасибо, я буду помнить это о будущих проектах! – Bonfi

Смежные вопросы