2017-02-02 61 views
-3

我真的不知道爲什麼這個程序不工作。這是在指針的幫助下完成的。這個程序計算偶數的號碼,但屏幕顯示:0或1C++程序給出錯誤結果

這...

#include <iostream> 
using namespace std; 

int evencount(int* x, int y) 
{ 
    int i, even = 0; 
    for (i = 0; i < y; i++); 
    { 
     if (*(x + i) % 2 == 0) { 
      even++; 
     } 
    } 
    return (even); 
} 

int main(void) 
{ 
    int n; 
    cout << "Enter size of array: "; 
    cin >> n; 
    int arr[n]; 
    cout << "Enter elements: "; 
    for (int i = 0; i < n; i++) { 
     cin >> *(arr + i); 
    } 
    int num; 
    num = evencount(arr, n); 
    cout << "Even count=" << num; 
    return 0; 
} 
+5

'INT ARR [N];'作爲寫入這不應編譯。 – RyanP

+1

'for(i = 0; i

+3

歡迎來到Stack Overflow!這聽起來像你可能需要學習如何使用調試器來遍歷代碼。使用一個好的調試器,您可以逐行執行您的程序,並查看它與您期望的偏離的位置。如果你打算做任何編程,這是一個重要的工具。進一步閱讀:** [如何調試小程序](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/)** – NathanOliver

回答

1
for(i=0;i<y;i++); 

你什麼都不做,在本作循環因此它總是檢查一個元素。位置yi的那個將通過for循環增加到該點。 位置y中的元素因此未定義且超出範圍,導致未定義的行爲。

+1

你應該澄清這個循環除了增加'i'什麼都不做的原因 - 即。 ';'。 –

+1

不,不是第一個,因爲在初始化之後,它會增加它,幷包括'y' –

+0

@YuriyIvaskevych yep good spot! – Francesco

-3

我看到的一個問題是您正在嘗試動態分配數組。在編譯的程序中,你需要有一個固定的arr分配。嘗試聲明arr爲int arr [100]。您仍然可以讓用戶輸入n作爲實際輸入的條目數量。

+5

指定任意數組大小的希望是足夠大是不好的做法。我不會鼓勵它作爲解決方案,而是將'std :: vector'視爲標準的替代方案。此外OP可能使用gcc,其中支持可變長度數組。雖然依靠這種擴展是一個壞主意,但並不會導致他的問題。 –

3

首先看一下循環:for(i=0;i<y;i++);

這裏有一個分號; - 這意味着你已經創建了一個空循環,實際上什麼也不做除了設置iy

現在這個:if (*(x + i)... - 這裏i等於y(先前循環後),這樣你訪問數組出界(x[y]無效,有效是隻索引在範圍[0,X-1]),從而調用未定義的行爲

而且在評論已經指出你的問題由@RyanP多了一個問題:

int arr[n]; < - 這不應該編譯(除非你使用一些特定的編譯器擴展)

爲了使一個數組動態大小,你可以這樣做:

  1. int *a = new int[n];

個或更好地利用std::vector用於這樣的目的:

  • std::vector<int>(n);