2016-07-24 8 views
0

次のコードは、行の最後に "制御が非空白関数の終了に達しました"という警告を生成します。何が間違っている可能性がありますか?クイック検索から、それは戻り値と関係しているようです。制御は非void関数の終了に達します警告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 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 
を明確にして、常に、書式設定に関するreturn文を置きます
+0

ありがとうございます。それは警告を取り除いた。しかし、出力は依然として不安定です。出力が正しい場合もあります。時々そうではない。不安定な動作をするコードはありますか?また、書式設定の提案に感謝します。 – ARSN

+0

@ARSNデバッガを使ってコードを検査することをお勧めします。私は何が間違っているのかは分かりません。 –

0

compute_hullすべてのコードパスでタイプstd::vector<csce::point<T>>の値を返すことになっているが、条件if(p==hull[0]){は常に失敗した場合は何も返しません。たとえば、最後の}の直前など、関数の最後に空のベクトルを返すことができます。

関連する問題