2016-07-24 7 views
0

Der folgende Code generiert "Kontrolle erreicht Ende der nicht-void-Funktion" Warnung am Ende der Zeile. Was könnte möglicherweise schiefgehen? Von der Schnellsuche scheint es mit dem Rückgabewert zu tun zu haben.Kontrolle erreicht Ende der nicht-void Funktion Warnung 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

Korrigieren Sie Ihre Formatierung und setzen Sie vor der letzten schließenden Klammer eine 'return'-Anweisung. –

+0

Rolled Ihre Bearbeitung, da die ursprüngliche Form ein wichtiger Teil für die richtige Antwort ist. –

Antwort

3

Korrekte Formatierung ist wichtig, um Warnungen und Fehlermeldungen des Compilers richtig zu interpretieren!

Dieses Muster am Ende der Funktionsdefinition

 } 
      } 
    } 
} 

ist ein klares Zeichen, Ihre Formatierung/Vertiefung ernsthaft nach oben geschraubt wird.

jedoch eine return-Anweisung vor der letzten Klammer setzen sollte der Fehler

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

auch wieder in Bezug auf die Formatierung beheben, immer klar machen, welche Codeblöcke verschachtelt sind (idealerweise Klammern verwenden)

  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

Danke. Das wurde die Warnung los. Die Ausgabe ist jedoch immer noch instabil. Manchmal ist die Ausgabe korrekt. Manchmal nicht. Gibt es einen Code, der ein instabiles Verhalten aufweist? Danke auch für den Formatierungsvorschlag. – ARSN

+0

@ARSN Ich würde Ihnen empfehlen, Ihren Code zu überprüfen, indem Sie den Debugger durchlaufen. Ich kann dir nicht sagen, was damit nicht stimmt. –

0

compute_hull soll einen Wert vom Typ std::vector<csce::point<T>> in allen Codepfade zurückkehren, aber Sie nichts zurück, wenn die Bedingung if(p==hull[0]){ nicht immer. Sie könnten beispielsweise am Ende der Funktion einen leeren Vektor zurückgeben, kurz vor dem letzten }.

Verwandte Themen