2012-06-13 38 views
1
#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「戰俘」未聲明在此範圍內

任何一個可以解釋爲什麼發生這個錯誤?

+1

將'pow()'的定義移到'main()'上方或者在'main()'之前聲明該函數,以便'main()'知道'pow()'是什麼。 –

+1

這個問題如何成爲「參數傳遞錯誤」? – juanchopanza

+1

你的函數'pow'沒有返回或輸出參數,並且似乎沒有副作用,所以任何體面的編譯器都應該優化它呢......也許你想讓'e'爲輸出參數,然後聲明'pow(int&e ,int b)'...你不應該把它稱爲「pow」,這表明它正在計算一個功率,它不會... – Walter

回答

8

C++編譯器按順序依次解析代碼文件。即線1然後線2然後線3 ...等等。因此,由當時的編譯器涉及到函數調用語句pow(e, b);main()功能,它尚未達到功能void pow(int e, int b)main()函數的定義,因此給你的錯誤。有兩種方法可以解決這個問題。

1)移動您計劃從main()調用)上述main()功能本身的void pow(int e, int b)定義(和任何其他功能。通過這種方式,編譯器已經解析並在您的功能到達行之前知道您的功能main()

2)另一種方式是使用前向聲明。這意味着在添加main()函數之前添加行void pow(int e, int b);。這告訴編譯器,這個代碼文件定義了前向聲明給出的函數(在本例中爲void pow(int e, int b)),但可以在文件中函數的定義代碼之前調用。這是一種更好的方法,因爲您的文件中可能有多個函數以不同的順序調用另一個函數,並且可能不容易重新排列它們的定義,使其在文件中調用之前出現。這裏有一個很好的閱讀Forward Declaration

您可能還想通過引用傳遞參數到您的函數來獲得正確的結果。即使用void pow(int& e, int& b)。這將導致你的pow()函數修改的值,實際應用到整數eb,而不僅僅是他們的份,這將pow()執行完畢後扔掉。關於在函數中通過引用傳遞參數的這個link在解釋這個方面非常好。

+1

+1有關詳細說明:) – Mahesh

+0

@Mahesh - 我記得當我剛接觸C++時,我的評論中的鏈接以及這些鏈接中的示例爲我澄清了一些事情,而像這篇OP帖子這樣簡單的東西會阻止我。我認爲這些可能對OP有幫助。 :) –

+0

+1在這裏也有詳細的描述:)對於SO這些類型的答案已經不夠了。 –

8

您需要轉發聲明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

+0

thanx它非常有用 – Ulaga

1

您需要使用函數的前向聲明pow。或者將它的定義移動到主要的函數之上。