2016-07-24 71 views
0

以下代码在行尾会生成“控制到达非空功能结束”警告。什么可能出错?从快速搜索来看,似乎与返回值有关。控制达到非无效功能警告结束C++

std::vector<csce::point<T>> compute_hull(std::vector<csce::point<T>>& points) const { 

     for(std::size_t x=0; x<points.size(); x++){ 

      for(std::size_t m=1; m<(1<<(1<<x)); m++){ 
       std::vector<std::vector<csce::point<T>>> hulls; 

       for(std::size_t i=0; i<points.size(); i=i+m){ 
       std::vector<csce::point<T>> chunk; 

       if(points.begin()+i+m <= points.end()) 
       chunk.assign(points.begin()+i,points.begin()+i+m); 

       else 
       chunk.assign(points.begin()+i,points.end());    
       hulls.push_back(this->graham_scan(chunk)); 
      } 


     std::vector<std::pair<int,int>> hull; 

     hull.push_back(this->extreme_hullpt_pair(hulls)); 

     for(std::size_t i=0; i<m; ++i){ 
      std::pair<int,int> p = this->next_hullpt_pair(hulls,hull[hull.size()-1]); 

      std::vector<csce::point<T>> output; 

      if(p==hull[0]){ 

       for(std::size_t j=0; j<hull.size(); j++){ 
        output.push_back(hulls[hull[j].first][hull[j].second]); 
       } 

       return output; 
      } 

      hull.push_back(p); 


     } 
      } 
    } 
} 
+2

修正你的格式并在最后一个大括号之前加上'return'语句。 –

+0

回滚您的编辑,因为原始形式是正确答案的重要部分。 –

回答

3

正确的格式对正确解释编译器警告和错误信息很重要!

这种模式在函数定义

 } 
      } 
    } 
} 

的到底是一个明确的信号您的格式/缩进严重搞砸了。

但是把一个return语句最后一个括号之前应该修正这个错误

// ... 
    return points; // <<<< 
} 

而且再次关于格式,始终明确哪些代码块嵌套(最好使用大括号)

  if(points.begin()+i+m <= points.end()) { 
       chunk.assign(points.begin()+i,points.begin()+i+m); 
      } 
      else { 
       chunk.assign(points.begin()+i,points.end()); 
      }   
      hulls.push_back(this->graham_scan(chunk)); // Outside if/else 
+0

谢谢。这摆脱了警告。但是,输出仍然不稳定。有时输出是正确的。有时候不是。有没有任何代码有不稳定的行为?另外,感谢您的格式化建议。 – ARSN

+0

@ARSN我建议你通过调试器来检查你的代码。我不能告诉你它有什么问题。 –

0

compute_hull应该在所有代码路径返回std::vector<csce::point<T>>类型的值,但如果条件if(p==hull[0]){总是失败,你不回任何东西。例如,可以在函数结尾返回一个空向量,就在最后一个}之前。

相关问题