2014-07-07 42 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

相关问题