2014-02-12 61 views
0

我不得不做一個二進制樹來排序一些記錄,但我一直在創建卡住。 我使用這個遞歸代碼產品proccesses的二叉樹:二進制處理樹給出了錯誤的結果

void proc_tree(int i, int current_depth, int max_depth, int rec, int offset) 
{ 
    pid_t kid = fork(); 

    if(kid == 0) 
    { 
    printf("[%d,%d]: start: %d, end: %d\n", i, current_depth, rec, offset); 

    if(current_depth < max_depth) 
    { 
     int nodes= pow(2, current_depth); 

     if(i >= nodes) 
     i = 0; 

     proc_tree(2*i+1, current_depth+1, max_depth, rec, offset/2); 
     proc_tree(2*i+1, current_depth+1, max_depth, offset/2, offset); 
    } 
    } 
} 

我沒有任何包含錯誤檢查我這樣做,我還沒有包括父親,因爲他正在做的唯一的事情代碼atm等待孩子結束。

輸出我得到是這樣的:

[0,0]: start: 0, end: 180 
[1,1]: start: 0, end: 90 
[3,2]: start: 0, end: 45 
[4,2]: start: 46, end: 90 
[2,1]: start: 91, end: 180 
[1,2]: start: 91, end: 90 
[2,2]: start: 91, end: 180 

正如你可以看到大部分值是很好,但在深度= 2的第一個節點([1,2])和([2,2 ])有錯誤的值。由於我們在深度= 2共獲得了181條記錄,因此有4個節點,因此每個節點應該分別管理大約45條記錄。所以[1,2]應該是91,136 和[2,2]應該是137,180。

我從主調用函數這樣

proc_tree(0, 0, 2, 0, 180); 

任何幫助,將不勝感激。 在此先感謝。

回答

2

你知道fork創建一個新的進程,每個進程都有自己的內存副本。

另外,操作系統可以按照它認爲合適的順序自由處理。

我想你正在考慮遞歸。在這種情況下,你不需要叉子。

+0

是的,我知道fork創建父地址內存的副本。我被要求爲一個任務創建一個二進制處理樹,並且我在互聯網上找到了這個解決方案,因爲我無法弄清楚如何使它正常工作......但是這也不起作用。我並不擔心結果的順序,因爲我熟悉時間安排,至少是基礎知識。事實上,這是與建議的聯繫http://stackoverflow.com/a/13038661/2212484 –

+0

儘管在深度2輸出的順序,處理過程應該有0,45--46,90--91,136--137 80。至少應該是這種情況,我不知道我是否錯過了這裏的任何東西,但是因爲我用這些參數調用函數,並且在該函數內部調用fork,所以打印的值不應該是我得到的值(以及我猜他們應該,因爲我得到他們,我只是不知道爲什麼)。我不想聽起來像一個屁股......我只是太累了,努力完成這項任務。 –