Was bedeutet „Kontrolle erreicht Ende der Nicht-Nichtigkeitsfunktion“?

Lesezeit: 4 Minuten

Benutzer-Avatar
teknolagi

Ich habe seltsame Compiler-Fehler bei diesem binären Suchalgorithmus erhalten. Da bekomme ich eine Warnung control reaches end of non-void function. Was bedeutet das?

int binary(int val, int sorted[], int low, int high) {
    int mid = (low+high)/2;

    if(high < low)
        return -1;

    if(val < sorted[mid])
        return binary(val, sorted, low, mid-1);

    else if(val > sorted[mid])
        return binary(val, sorted, mid+1, high);

    else if(val == sorted[mid])
        return mid;
}

Der Compiler kann diesem Code nicht entnehmen, ob die Funktion jemals das Ende erreicht und immer noch etwas zurückgibt. Um das zu verdeutlichen, ersetzen Sie den letzten else if(...) nur mit else.

  • (Und der Compiler hat Angst, weil eine Funktion, die so eingegeben wurde, dass sie eine zurückgibt int muss eigentlich an zurückgeben intund fallen nicht einfach vom Ende der Funktion ab)

    – marnir

    30. Mai 2011 um 1:18 Uhr


  • Danke! Das macht Sinn! wird das nicht etwas Unerwünschtes einfangen?

    – teknolagi

    30. Mai 2011 um 1:18 Uhr

  • @teknolagi, naja, die Logik für uns Menschen ist ganz klar: val kann nur sein <, >oder == zu sorted[mid]es gibt wirklich keine Alternative … Also kann es nichts anderes fangen, wenn das die ganze Logik ist.

    – loswerden

    30. Mai 2011 um 1:21 Uhr


  • Eine andere Möglichkeit, die Warnung loszuwerden, ist das Hinzufügen assert(false); am Ende der Funktion, um dem Compiler (und dem menschlichen Leser) klar zu sagen, dass Sie absichtlich weggelassen haben anders Fall, weil Sie sicher sind, dass es nicht passieren kann.

    – dpi

    8. Juli 2018 um 17:34 Uhr

Der Compiler ist nicht intelligent genug, um das zu wissen <, >und == sind ein “komplettes Set”. Sie können es wissen lassen, indem Sie die Bedingung “if(val == sorted[mid])” — es ist überflüssig. Sagen Sie einfach “else return mid;

  • Der Compiler ist schlau genug. Das Problem ist, dass der Benutzer nicht schlau genug war, eine Optimierungsstufe ungleich Null anzugeben. -O0 ist fast immer eine sehr sehr schlechte Idee.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    30. Mai 2011 um 2:24 Uhr

  • Interessante Idee, aber ich glaube nicht. Zum Beispiel, gcc gibt diesen Fehler mit -O3 .

    – Ernest Friedman Hill

    30. Mai 2011 um 2:44 Uhr

  • Allerdings habe ich mit gcc 4.5.2 bestätigt.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    30. Mai 2011 um 3:02 Uhr

  • Außerdem habe ich das Hinzufügen von a getestet printf call am Ende der Funktion, und gcc generiert tatsächlich Code dafür. Irgendwie wird dieser Punkt also nicht als unerreichbar erkannt …

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    30. Mai 2011 um 3:04 Uhr

Fehlerbild

Wenn die Funktion nicht ungültig ist, bedeutet dies, dass sie etwas zurückgeben muss, bevor sie das Ende des Funktionsblocks erreicht[ _} ]Wenn wir also nur if- und else-if-Anweisungen angeben, kann der Compiler diesem Code nicht entnehmen, dass irgendeine dieser Anweisungen als wahr ausgewertet wird und etwas zurückgibt. Das heißt, wenn alle Bedingungen als falsch ausgewertet werden, wird die Steuerung dies tun Erreichen Sie das Ende der Funktion, ohne etwas zurückzugeben, was falsch ist.

Erstellen Sie immer mit mindestens minimaler Optimierung. Mit -O0, wurden alle Analysen, die der Compiler verwenden könnte, um festzustellen, dass die Ausführung das Ende der Funktion nicht erreichen kann, deaktiviert. Aus diesem Grund sehen Sie die Warnung. Die einzige Zeit, die Sie jemals nutzen sollten -O0 ist für das schrittweise Debuggen, was normalerweise sowieso kein guter Debugging-Ansatz ist, aber es ist das, was die meisten Leute, die mit MSVC angefangen haben, gelernt haben …

Ich hatte das gleiche Problem. Mein Code unten hat nicht funktioniert, aber als ich das letzte “if” durch “else” ersetzt habe, funktioniert es. Der Fehler war: kann das Ende der nicht ungültigen Funktion erreichen.

int shifted(char key_letter)
  {
        if(isupper(key_letter))
        {
            return key_letter - 'A'; 
        }

        if(islower(key_letter)   //<----------- doesn't work, replace with else

        {                                            


            return key_letter - 'a'; 
        }

  }

Benutzer-Avatar
Suraj Shende

Stellen Sie sicher, dass Ihr Code unabhängig von bedingten Anweisungen einen Wert des angegebenen Rückgabetyps zurückgibt

Dieses Code-Snippet zeigte denselben Fehler

int search(char arr[], int start, int end, char value)
{
    int i;
    for(i=start; i<=end; i++)
    {
        if(arr[i] == value)
            return i;
    }
}

Dies ist der Arbeitscode nach kleinen Änderungen

int search(char arr[], int start, int end, char value)
{
    int i;
    int index=-1;
    for(i=start; i<=end; i++)
    {
        if(arr[i] == value)
            index=i;
    }
    return index;
}

Benutzer-Avatar
Jayanth sattineni

Es bedeutet, dass nach einer Funktion gesucht wird, die abgeschlossen werden muss.

else if(val == sorted[mid]) return mid;

Entfernen Sie also den if()-Teil und ändern Sie den Code oder fügen Sie am Ende ein else() hinzu, das ein int zurückgibt.

1383120cookie-checkWas bedeutet „Kontrolle erreicht Ende der Nicht-Nichtigkeitsfunktion“?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy