2014-03-27 52 views
1

我有以下代碼正在執行基於數組和值的二進制搜索以查找傳遞給函數。但是,當我進入函數時,數組沒有值。這是爲什麼發生?我看過,我相信在傳遞陣列方面一切都是正確的。傳遞給函數時數組爲空

#include <iostream> 
using namespace std; 

int binSearch(int [], int , int , int); 

void main() 
{ 
    int a[10]; 
    int low; 
    int high; 
    int searchValue; 

    for (int i = 0; i < 10; i++) 
    { 
     a[i] = i;   
    } 

    low = 0; 
    high = 9; 
    searchValue = 6; 
    int searchResult = binSearch(a, low, high, searchValue); 
    cout << searchResult << endl; 
} 

int binSearch(int a[], int low, int high, int searchValue) 
{ 
    int newHigh; 

    newHigh = (low + high)/2; 

    if (low > high) 
    { 
     return -1; 
    } 

    else if (high == low) 
    { 
     if (a[high] == searchValue) 
     { 
      return high; 
     } 

     else 
     { 
      return -1; 
     } 
    } 

    else if (a[newHigh] < searchValue) 
    { 
     return binSearch(a, low, newHigh, searchValue); 
    } 

    else 
    { 
     return binSearch(a, newHigh, high, searchValue); 
    } 
} 
+3

_...數組有沒有值..._你怎麼發現? –

+2

該數組確實有值,但是你的算法是錯誤的。 –

+0

該數組用for循環賦值,然後傳遞。調試時,當它進入binSearch時,數組中不包含任何內容......所以算法放在一邊,它仍然沒有任何東西...... – cb1295

回答

4

當你將一個數組傳遞給函數時,它被稱爲"decay" into a pointer。 C++中的數組是第二類公民,只要你將它們傳遞到某個地方,它們就會自動轉換爲指向第一個元素的指針。這意味着當你檢查函數內部的「數組」時,你實際上正在查看第一個元素的值(因爲數組衰減爲指向第一個元素的指針)。

此時可以將其作爲數組檢查的一種方式是將其添加到監視窗口(右鍵單擊 - >添加監視或在監視窗口中鍵入變量名稱)並將其添加到put a comma next to it along with the size of the array

例如在監視窗口中鍵入a, 10,而在bin_search函數中將顯示a指向的前10個元素。

+1

謝謝,這有幫助。我改變了參數爲'(&a)[10]',它完美地工作。算法只是需要現在改變,因爲它是不正確的,如上所述。 – cb1295

+0

你是什麼意思你「改變了論點是(&a)[10]'」,我不太確定我理解你的意思。 –

+1

不,我把它定義爲int binSearch(int(&a)[10],int,int,int)'這幫助我理解了爲什麼我認爲它沒有得到通過的問題,實際上發生的是「衰退「你描述。我現在意識到,在你的幫助和下面的答案中,真正的問題在於算法,爲什麼我沒有得到我應該得到的結果。 – cb1295

1

陣列很好。 main()應該在C++中返回int,並且二進制搜索算法需要更正。

#include <iostream> 
using namespace std; 

int binSearch(int [], int , int , int); 

int main() 
{ 
    int a[10]; 
    int low; 
    int high; 
    int searchValue; 

    for (int i = 0; i < 10; i++) 
    { 
     a[i] = i; 
    } 

    low = 0; 
    high = 9; 
    searchValue = 6; 
    int searchResult = binSearch(a, low, high, searchValue); 
    cout << searchResult << endl; 
    return 0; 
} 

int binSearch(int a[], int low, int high, int searchValue) 
{ 
    int mid; 

    mid = (low + high)/2; 

    if (low > high) 
    { 
     return -1; 
    } 

    if (a[mid] == searchValue) 
    { 
     return mid; 
    }  
    else if (a[mid] < searchValue) 
    { 
     return binSearch(a, mid+1, high, searchValue); 
    }  
    else 
    { 
     return binSearch(a, low, mid-1, searchValue); 
    } 
} 
+0

非常感謝!這是算法一直給我-1,因爲它進入了錯誤的分支。但是,我也瞭解到,傳遞的是指向第一個元素的指針,這就是爲什麼當我在調試中查看它時會看到零。 – cb1295

+0

對於其他情況,在遞歸調用中它不應該是'mid-1',它應該只是'mid'。這是因爲整數除法的工作方式,如果你想嘗試搜索中間,它將不會像以前那樣工作。否則,一切運作良好,謝謝。 – cb1295

+0

已更正,請參閱已編輯的版本。樂意效勞! – stakri

0

只是改變 int binSearch(int a[], int low, int high, int searchValue)

int binSearch(int* a, int low, int high, int searchValue)

+1

您建議的功能簽名都是等效的。數組自然被腐蝕成指針。另外,使用數組語法指示參數是數組沒有任何問題。 –