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);
任何幫助,將不勝感激。 在此先感謝。
是的,我知道fork創建父地址內存的副本。我被要求爲一個任務創建一個二進制處理樹,並且我在互聯網上找到了這個解決方案,因爲我無法弄清楚如何使它正常工作......但是這也不起作用。我並不擔心結果的順序,因爲我熟悉時間安排,至少是基礎知識。事實上,這是與建議的聯繫http://stackoverflow.com/a/13038661/2212484 –
儘管在深度2輸出的順序,處理過程應該有0,45--46,90--91,136--137 80。至少應該是這種情況,我不知道我是否錯過了這裏的任何東西,但是因爲我用這些參數調用函數,並且在該函數內部調用fork,所以打印的值不應該是我得到的值(以及我猜他們應該,因爲我得到他們,我只是不知道爲什麼)。我不想聽起來像一個屁股......我只是太累了,努力完成這項任務。 –