2014-01-04 4 views
2

Я только учусь C++ и у меня есть немного кода здесь:Вызов функции в основной

using namespace std; 

int main() 
{ 
    cout<<"This program will calculate the weight of any mass on the moon\n"; 

    double moon_g(); 

} 

double moon_g (double a, double b) 
{ 
    cout<<"Enter the mass in kilograms. Use decimal point for any number entered"; 
    cin>>a; 
    b=(17*9.8)/100; 
    double mg=a*b; 
    return mg; 
} 

Он компилирует, но когда я запускаю его он печатает только:

This program will calculate the weight of any mass on the moon

, но не выполняет функцию moon_g.

+0

Возможный дубликат [The Definitive C++ Book Guide and List] (http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list) –

+0

Благодарю всех вас за помощь! – user3150381

+0

Итак, единственный способ вызвать функцию в C++ из основной функции - cout << определенная функция? – user3150381

ответ

1

Существует огромная разница между вызовом функции и объявлением ее так же, как разница между локальными переменными и аргументами функции.

Предлагаю сначала ознакомиться с основными учебными пособиями.

Во всяком случае, вот как код должен выглядеть следующим образом:

#include <iostream> 
using namespace std; 

double moon_g() 
{ 
    double a,b; 
    cout<<"Enter the mass in kilograms. Use decimal point for any number entered\n"; 
    cin>>a; 
    b=(17*9.8)/100; 
    double mg=a*b; 
    return mg; 
} 

int main() 
{ 
    cout<<"This program will calculate the weight of any mass on the moon\n"; 

    cout<<"Result is: "<<moon_g(); 
} 
+0

спасибо! это сработало отлично! Итак, я изучаю онлайн-учебник C++. Com, и сейчас я нахожусь в разделе «объявления функций». В нем говорится, что фактическое место функции main() внутри кода не имеет значения, поскольку main всегда называется первым. Так неправильно, что они говорят, что, поскольку запись moon_g() перед основным, казалось, имела значение. – user3150381

+0

Местоположение main() не имеет значения, расположение функций, которые вы вызываете из main(). Файлы исходного кода C++ скомпилированы «по очереди», поэтому сначала вам нужно объявить хотя бы заголовок функции, прежде чем вы сможете ее вызвать. В, например, C# такие детали не имеют значения, поскольку это современный язык, в то время как C/C++ все еще держится за давние ограничения 4KB RAM, которые не позволяют сразу считывать весь файл в память. (Можно сказать, что разделение на .h и .cpp делает код более понятным для чтения, но, с другой стороны, расширенная IDE предоставляет инструменты для управления кодом). – PTwr

+0

@ user3150381 cplusplus.com часто поспешно написан и не проверяется фактом. Это не вики. Избегайте полагаться на него. – Potatoswatter

2

Это объявление функции:

double moon_g(); 

это не будет вызывать функцию, и если вы действительно были это правильно, что означает добавление двух параметров, так как вы определяете это ниже:

moon_g(a, b) ; 

это не сработает, потому что вы эр необходимо переместить определение moon_g перед тем main или добавить вперед декларацию до main как это:

double moon_g (double a, double b) ; 

Хотя кажется a и b не являются входами, а значения, которые вы хотите, чтобы вернуться обратно в main то вам нужно будет использовать ссылки и должны быть объявлены и определены следующим образом:

double moon_g (double &a, double &b) ; 
        ^  ^

полезный поток для чтения, особенно если вы начинаете будет What is the difference between a definition and a declaration?.

Какой компилятор вы используете делает разницу здесь clang обеспечивает следующее предупреждение:

warning: empty parentheses interpreted as a function declaration [-Wvexing-parse] 
    double moon_g(); 
       ^~ 

в то время как я не могу получить gcc ни Visual Studio, чтобы предупредить меня об этом. В конечном итоге полезно попробовать код в разных компиляторах C++, когда вы можете это сделать, это может быть очень учебный опыт, и вам не нужно их устанавливать, так как есть много online C++ compilers available online.

5

Эта линия:

double moon_g(); 

фактически не делать ничего, он просто заявляет, что функция double moon_g() существует. То, что вы хотите что-то вроде этого:

double weight = moon_g(); 
cout << "Weight is " << weight << endl; 

Это еще не будет работать, потому что у вас нет функции double moon_g(), что у вас есть функция double moon_g(double a, double b).Но эти аргументы на самом деле не используются ни для чего (ну, они есть, но нет причин, чтобы они проходили как аргументов). Таким образом, устранить их из вашей функции следующим образом:

double moon_g() 
{ 
    cout<<"Enter the mass in kilograms. Use decimal point for any number entered"; 
    double a; 
    cin>>a; 
    double b=(17*9.8)/100; 
    double mg=a*b; 
    return mg; 
} 

(И объявить функцию перед вызовом его.) Больше уточнений возможно, но это будет достаточно.

0

В коде есть две проблемы.

Во-первых, если вы хотите назвать вашу функцию

double moon_g (double a, double b) // this means if you want to call moon_g() you must provide arguments a and b, otherwise, the you will encounter an compile error. 
{ 
    cout<<"Enter the mass in kilograms. Use decimal point for any number entered"; 
    cin>>a; 
    b=(17*9.8)/100; 
    double mg=a*b; 
    return mg; 
} 

вы должны предоставить два параметра a и b. Но a и b рассчитываются в теле определения функции, нет необходимости объявлять два параметра. Вы можете написать вот так.

double moon_g() //this means function moon_g() does not accept any arguments 
{ 
    double a, b; // declare a and b in the definition body instead of in the arguments list 
    cout<<"Enter the mass in kilograms. Use decimal point for any number entered"; 
    cin>>a; 
    b=(17*9.8)/100; 
    double mg=a*b; 
    return mg; 
} 

Тогда в основной функции оператор вашей вызывающей функции ошибочен. Вы можете получить возвращаемое значение. Итак, вы должны написать такой код.

int main() 
{ 
    cout<<"This program will calculate the weight of any mass on the moon\n"; 

    double ret = moon_g(); 
} 

Наконец, в основном рекомендуется, чтобы функция, которая будет вызываться другой функцией, должна быть объявлена ​​или определена ранее.

+0

Большое спасибо за ваш ответ! Я попытался запустить программу точно так, как вы указали. вот что произошло: 1. double moon_g(), без аргументов double a и double b, дает мне ошибку: a и b не были объявлены в этой области. Если я верну эти аргументы в double moon_g() и запустим его, это даст мне ошибку: слишком мало аргументов для double ret = moon_g(). Я не знаю, что я делаю неправильно. Я попытался скомпилировать его Dev C++. – user3150381

+0

О, моя ошибка, вы должны объявить 'a' и' b' в теле определения функции, а не в списке аргументов. Я снова редактирую свой код. Извините за мою ошибку. – Jeff

+0

Кроме того, 'double ret = moon_g()', 'ret' будет хранить возвращаемое значение, вычисленное moon_g(); – Jeff

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