2016-08-08 21 views
1
int findpow(int n1,int k, int count){ //while calling, k=1, count=0 
    if(k<n1) 
     return findpow(n1,k*2,count+1); 
    if(k==n1) 
     return count; 
    if(k>n1) 
     return --count; 
} 

Dies ist eine Funktion, die den größten Zweierpotenz weniger als n zurückgibt. Wenn ich es in meinem ubuntu Terminal (g ++ 4.8.4) starte, funktioniert es gut. Aber wenn ich es auf www.hackerrank.com laufen lasse, gibt es einen Fehler (Kontrolle erreicht Ende der nicht void Funktion). Das Problem ist, dass ich an vielen Wettbewerben auf dieser Website teilnehme und ich bin mehrmals auf dieses Problem gestoßen.Steuerung erreicht Ende nicht-Hohlraumfunktion (nur auf bestimmte IDEs)

Bitte sagen Sie mir, wenn Sie wissen, wie ich es beheben kann.

+0

Es gibt [verschiedene schnellere Möglichkeiten, um die größte Potenz von 2 weniger zu bekommen als n] zu sein (http s: //graphics.stanford.edu/~seander/bithacks.html#RoundUpPowerOf2) –

+0

Sie sollten wahrscheinlich den Unterschied zwischen einem Compiler und einer IDE lernen. Es würde Ihnen helfen, bessere Fragen zu stellen. –

+1

Der Compiler ist nicht schlau genug zu sehen, dass die Funktion immer zurückkehrt, Sie müssen es helfen. – Jarod42

Antwort

4

Sie können else if Anweisung wie folgt verwendet werden:

int findpow(int n1,int k, int count){ //while calling, k=1, count=0 
    if(k<n1) 
     return findpow(n1,k*2,count+1); 
    else if(k==n1) 
     return count; 
    else // Eliminate compiler errors (warnings) 
     return --count; 
} 

oder wie gesagt @juanchopanza:

int findpow(int n1,int k, int count){ //while calling, k=1, count=0 
    if(k<n1) 
     return findpow(n1,k*2,count+1); 

    if(k==n1) 
     return count; 

    // Eliminate compiler errors (warnings) 
    return --count; 
} 

Es wird das gleiche wie Ihr Code tun, aber keinen Zweifel geben Compiler das können keine Rückkehrpunkte von der Funktion sein.

+1

Oder 'return --count;' außerhalb eines 'if'. – juanchopanza

+0

@juanchopanza: Natürlich :) – Mykola

1

Kontrolle erreicht Ende nicht leer Funktion "ist eine Warnung, kein Fehler, es ist sicher in diesem Fall zu ignorieren, aber wenn Sie die Warnung, dort zu unterdrücken wollen, sind mehrere Möglichkeiten:

  • legte eine Rückkehr nach die letzte Bedingung
  • wie Mykola vorgeschlagen die Bedingungen restrukturieren explizite
  • den -Wno-return-Typ-Flag gesetzt
+1

Wenn Sie jedoch eine Rückgabe nach der letzten Bedingung hinzufügen, werden einige Compiler vor nicht erreichbarem Code warnen. Du kannst nicht gewinnen. –

+0

Der letzte Vorschlag macht Sie manuell auf der Suche nach heimtückischem undefiniertem Verhalten, vor dem der Compiler sonst gewarnt hätte. Die Umstrukturierung des Codes ist die bessere Option. – user4581301

+0

Ich habe es weggelassen, weil ich dachte, dass es offensichtlich ist, aber aus Gründen der Klarheit können Sie die Warnung lokal drücken und knallen lassen –