2012-10-13 23 views
0

我應該習慣使用fork,並且我看到一個練習,表示使用fork調用來搜索索引爲0到15的數組。我們假設每個過程都可以只做兩件事......(1)檢查一個數組是否爲長度爲1,並且(2)比較數組中的單個元素與正在搜索的數量。基本上我通過它一個數字,它應該做有限數量的叉子並返回該數字的索引。這裏是我的代碼..用叉子搜索C

#define MAXINDEX 16 

int forkSearch(int a[], int search, int start, int end){ 
    if(start == end){ 
    if(*(a + end) == search){ 
     return end; 
    } 
    } 
    else{ 
    pid_t child = fork(); 
    if(child == 0) return forkSearch(a, search, start, end/2); 
    else return forkSearch(a, search, (start + end)/2, end); 
    } 
} 

int main(int argc, char* argv[]){ 
    int searchArray[MAXINDEX] = {1, 12, 11, 5, 10, 6, 4, 9, 13, 2, 8, 14, 3,\ 
           15, 7}; 
    printf("Should be 1. Index of 12 = %d\n", forkSearch(searchArray, 
                 12, 0, MAXINDEX)); 
    return 0; 
} 

一切都在這個快速爆炸計劃的回報似乎是1,10,11,或13爲什麼沒有這方面的工作像它應該。

+0

不是你的解決方案,但你打算用15個值初始化16個int的數組嗎? – WhozCraig

+4

「我應該對叉子感到舒服」 - 試試勺子,並小心使用刀子:-) –

+2

不應該讓您的子程序搜索'(a,search,start,(start + end)/ 2 )'而不是'(a,search,start,end/2)'?這兩個只相當於start == 0時,這並不總是這樣的... – cHao

回答

4
if(child == 0) return forkSearch(a, search, start, end/2); 

這是錯誤end那裏,它應該是(start+end)/2,並在右半搜索的開始索引應該是(start+end)/2 + 1。否則,如果右半部分爲(start+end)/2 .. end,那麼當end == start+1時,遞歸調用的start是舊的start值,並且您有無限循環。

程序具有不確定的行爲,因爲

int forkSearch(int a[], int search, int start, int end){ 
    if(start == end){ 
    if(*(a + end) == search){ 
     return end; 
    } 
    } 

如果start == end沒有返回值,但*(a+end) != search。在內部if之後添加exit(0);以退出未找到目標的進程。

int searchArray[MAXINDEX] = {...}; 

forkSearch(searchArray, 12, 0, MAXINDEX) 

將導致searchArray[MAXINDEX]出界限訪問,也是未定義的行爲。

+0

+1:魚..讓我在晚上向你介紹你的酒桶。 – WhozCraig

+0

好吧,關於在桶裏拍攝魚的事情,但不幸的是,我不明白這個笑話。 –

+0

現在它只是無限循環運行..?固定。找到了。 -1在錯誤的位置。 – SetSlapShot