'pow' не был объявлен в этой области

#include <iostream>
#include <string.h>

using namespace std;

int main()
{
    int e=0;
    int b=0;
    cout<<"Enter Exponent";
    cin>>e;
    cout<<"Enter Base";
    cin>>b;
    pow(e, b);
    cout<<"Power:"<<e;
    return 0;
}

void pow(int e, int b)
{
  int t=1;
  while(b==t)
  {
    e=e*b;
    t++;
  }
}

Вот ошибка, которую я получил:

ulaga.cpp|29|error: 'pow' was not declared in this scope

Кто-нибудь может объяснить, почему возникла эта ошибка?


person Ulaga    schedule 13.06.2012    source источник
comment
Переместите определение pow() выше main() или объявите функцию перед main(), чтобы main() знал, что такое pow().   -  person Alok Save    schedule 13.06.2012
comment
Как эта проблема связана с ошибкой передачи аргумента?   -  person juanchopanza    schedule 13.06.2012
comment
ваша функция pow не имеет возвращаемых или выходных аргументов и, по-видимому, не имеет побочных эффектов, поэтому любой приличный компилятор должен в любом случае оптимизировать ее ... возможно, вы хотели иметь e выходной аргумент, а затем объявить pow(int&e, int b) ... и вы не должны назовите это pow, что предполагает, что он вычисляет мощность, которой он не...   -  person Walter    schedule 13.06.2012


Ответы (4)


Компилятор C++ анализирует файл кода последовательно по порядку. то есть строка 1, затем строка 2, затем строка 3... и так далее. Таким образом, к тому времени, когда компилятор дойдет до оператора вызова функции pow(e, b); в вашей функции main(), он еще не достиг определения функции void pow(int e, int b) ниже функции main() и поэтому выдает ошибку. Есть два способа решить эту проблему.

1) Переместите определение void pow(int e, int b) (и любой другой функции, которую вы планируете вызывать из main()) над самой функцией main(). Таким образом, компилятор уже проанализировал вашу функцию и узнает о ней до того, как она достигнет строки pow(e, b); в вашем main().

2) Другой способ - использовать предварительное объявление. Это означает добавление строки void pow(int e, int b); перед функцией main(). Это сообщает компилятору, что функция, указанная в предварительном объявлении (в данном случае void pow(int e, int b)), определена в этом файле кода, но может быть вызвана перед кодом определения функции в файле. Это лучший метод, так как в вашем файле может быть несколько функций, вызывающих друг друга в разном порядке, и может быть непросто переупорядочить их определения, чтобы они отображались до того, как они будут вызваны в файле. Вот хорошее чтение по Forward Declaration

Вы также можете передать параметры по ссылке на вашу функцию, чтобы получить правильный результат. т. е. используйте void pow(int& e, int& b). Это приведет к тому, что значения, измененные в вашей функции pow(), будут фактически применены к целым числам e и b, а не только к их копиям, которые будут удалены после завершения выполнения pow(). Эта ссылка о передаче аргументов по ссылке в функциях довольно хорошо объясняет это.

person Chinmay Nerurkar    schedule 13.06.2012
comment
@Mahesh - я вспомнил, как ссылки в моем комментарии и примеры в этих ссылках прояснили для меня некоторые вещи, когда я был новичком в C ++, и простые вещи, такие как этот пост OP, удерживали меня. Я подумал, что это может быть полезно для OP. :) - person Chinmay Nerurkar; 13.06.2012

Вам нужно предварительно объявить функцию pow. Нравиться -

....
void pow(int e, int b);

int main()
....

Здесь есть несколько неправильных вещей. Например, e передается по значению. Итак, e в основном отличается от pow.

pow(e, b);
cout<<"Power:"<<e;  // This just prints the value taken from console
                    // And not the calculated power.

Либо сделайте функцию pow для возврата значения (или) передайте e по ссылке.

person Mahesh    schedule 13.06.2012

Это можно легко исправить, просто импортировав #include <cmath> в начало вашего кода.

person hmofrad    schedule 12.12.2019

Вам нужно использовать предварительное объявление вашей функции pow. Или просто переместите его определение над функцией main.

person Aleksandr Kravets    schedule 13.06.2012