2014-07-07 45 views
-3

我有過這種類型的經驗很多次:在遞歸函數中使用printf(),輸出是一個隨機數。但是,使用fflush(stdout)修復了輸出。爲什麼會發生?示例:爲什麼printf()在遞歸函數中顯示異常行爲?

以下代碼是段樹實現。所述rangeQuery()函數返回在給定範圍內

node rangeQuery(node* tree, int root, int lml, int rml, int u, int v) 
    { 
     //query [u,v] where all descendants of root are in [lml,rml] 

     fflush(stdout);  //<<<<------------------------------HERE 
     if (u<=lml && rml<=v) 
      return tree[root]; 

     int m=(lml+rml)/2, lc=root*2, rc=root*2+1; 
     tree[root].split(tree,tree[lc],tree[rc]); 

     node l,r; 

     if (u <= m) 
      l = rangeQuery(tree, lc, lml, m, u, v); 
     if (v > m) 
      r = rangeQuery(tree, rc, m+1, rml, u, v); 

     tree[root].merge(tree,tree[lc],tree[rc]); 

     node res; 
     res.merge(tree, l, r); 
     return res; 
    } 
    int main() 
    { 
     //.... 
     int opt,a,b; 
     scanf("%d%d%d",&opt,&a,&b); 
     a--; 
     b--; 
     node newNode; 
     newNode = rangeQuery(tree, 1, 1<<n, (1<<(n+1))-1, a+(1<<n), b+(1<<n)); 
     printf("%d",newNode.val); 
     //.... 
    } 

最大元素的完整代碼可以在這裏找到:http://ideone.com/cTT0X3

正如上面可以看出,從rangeQuery除去fflush()()函數產生一個亂碼輸出,而使用fflush()會產生正確的輸出(3)。任何幫助表示讚賞。

+1

該問題未能說明預期的結果和獲得的結果。問題描述只包含單個單詞「亂碼」,它是模糊不清的。 –

+0

@DavidSchwartz好的,我會添加一些細節 – Ambar

+1

@Ambar你不僅應該添加你期望的細節,還要把你的代碼降低到絕對必要的最小值。另一方面,這一方面太多的信息太少,另一方面太少。 – stefan

回答

1

雖有各種錯誤,包括:使用的C++ C++程序文件內的對象C變量長度數組

  • ;
  • 混合C(scanf)和C++輸入(cin);
  • 使用內部頭<bits/stdc++.h>

錯誤的主要原因是uninitialiased變量:

node l,r; // **** here 

    if (u <= m) 
     l = rangeQuery(tree, lc, lml, m, u, v); 
    if (v > m) 
     r = rangeQuery(tree, rc, m+1, rml, u, v); 

    tree[root].merge(tree,tree[lc],tree[rc]); 

    node res; 
    res.merge(tree, l, r); 

如果任一條件句不成立,那麼lr將未初始化,意義對res.merge的呼叫具有未定義的行爲。

使用node l{},r{};對它們進行初始化會導致您的程序輸出3,儘管它可能仍然包含其他錯誤。

1

此:

printf("%d",newNode.val); 

缺少終止新行,以便輸出將被緩衝,直到下一個新行被打印出來,或者fflush(stdout);被調用。這可能解釋你所看到的。

+0

我們永遠不會知道,直到他說出了什麼是錯的/他期望看到的! –

+0

@Poldie我編輯它,我想現在它更解釋。 – Ambar

相關問題