2013-08-17 152 views
0

我正在嘗試一些練習來學習使用指針與數組和函數。 所以我試圖編寫一個「奇怪的方式」來找出一定範圍內的素數。C++不想要返回值

問題是,輸出總是添加函數的返回值與素數的算法。如果我忽略它,它顯示'32767',如果我寫return *pt,它會添加範圍的最後一個數字,即使它不是素數!

剛剛用數字6試過:它不是主要的,但它彈出!

#include <iostream> 
int show_primes(const int * begin, const int * end); 
int main() 
{ 
    using namespace std; 
    int i = 0; 
    int End_Array = 0; 
    cout << "Write the last number in your range (it always start from number 2)"; 
    cin >> End_Array; 
    i=End_Array; 
    int cookies[i]; 
    for(i=-1; i<End_Array; i++) 
     cookies[i] = i+1; 
    cout << show_primes(cookies, cookies + End_Array-1); 
} 
int show_primes (const int * begin, const int * end) 
{ 
    using namespace std; 
    const int * pt; 
    int z = 0; 
    for (pt = begin; pt < end; pt++, z=0) 
    { 
     for (int n=2; n<=*pt; n++) 
     if (*pt%n == 0) 
      ++z; 
     if (z==1) 
      cout << *pt <<endl; 
    } 
    return *pt ; 
} 
+0

爲什麼這個功能需要一個返回值呢? – Chad

+0

至少,寫入'cookies [-1]'會導致未定義的行爲。 –

+0

其實我不太確定...但是如果你不放置返回值,會發生什麼是它增加'32767',我不知道它來自哪裏! – theskunk

回答

0
for(i=0; i<End_Array; i++) // Start from zero 
    cookies[i] = i; //Use i 

// Don't use cout 
show_primes(cookies, cookies + End_Array-1); 
+0

這不是打印的地址。 –

1

您的循環正在訪問負數索引處的值。

cookies[i] = i+1; //For first iteration, value of i is -1 

所以for(i=-1; i<End_Array; i++)應改爲for(i=0; i<End_Array; i++)

而且,你不需要因爲你是在自身內

雖然使用的是指針對於你的學習打印的值從函數返回,一個更簡單的實現將是:

#include <iostream> 
using namespace std; 
void show_primes(int num) 
{ 
    bool flag = false; 
    for (int pt = 2; pt < num; pt++) 
    { 
     if (num%pt == 0) 
     { 
      flag = true; 
      break; 
     } 
    } 
    if(!flag) 
    { 
     cout<<num<<' '; 
    } 
} 
int main() 
{ 
    int End_Array = 0; 
    cout << "Write the last number in your range(>2)"; 
    cin >> End_Array; 
    for(int i=2; i<End_Array; i++) 
    { 
     show_primes(i); 
    } 
} 

PS:可有人請強調它是一個不好的做法,包括在每一個功能模塊std命名空間OP已經完成。(我認爲這是)

+0

好的,謝謝......我將它排除在非負面之外,但沒有什麼不同。 – theskunk