Ошибка: управление может достигнуть конца не пустой функции

Пожалуйста, кто-то может объяснить мне, что не так, почему я получаю эту ошибку:

error: control may reach end of non-void function

Я пытаюсь сделать функцию linearsearch() взятие ключа и таблицы, возвращающей индекс элемента, если он найден. Это сбивает с толку; Я новичок и прохожу курс CS50 онлайн; У меня никогда не было этой ошибки раньше.

#include <stdio.h>
#include <string.h>
#include <cs50.h>

int linearsearch(int key, int array[]);

int main(int argc , string argv[])
{ 
    int key = 0;
    int table[]={2,4,5,1,3};

    printf("%i is found in index %i\n",key,linearsearch(1,table));
}

int linearsearch(int key, int array[])
{
    for(int i = 0;i<5;i++){
        if(array[i] == key)
        {
             return i;
        }    
        else{
            return -1;
        }
    }
}

1 ответ

Решение

В последнем цикле for вы возвращаете что-то из функции в любом случае, поэтому не должно быть никаких проблем (за исключением того, что ваш алгоритм неверен: он не должен возвращаться немедленно, если не найден).

Проблема в том, что компилятор не обязательно видит, что вы возвращаете все данные. Он просто видит, что не заканчивает рутину, возвращая что-то.

Большинство компиляторов могут выяснить простые случаи, такие как:

   if (x) return 0; else return 1;
  // not returning anything in the main branch but ok as it's seen as unreachable
}

но в вашем случае у вас есть for цикл, возвращающий инструкции возврата. Компиляторы не являются анализаторами потока управления. Они делают основные вещи, но, конечно, не формальное исполнение. Так что иногда они выдают предупреждение, где с вашей точки зрения все в порядке.

В любом случае, ваш алгоритм неверен, как упоминалось ранее. Исправьте это, возвращая -1 только тогда, когда цикл заканчивается, ничего не найдя.

В этом случае вы исправляете свою ошибку и предупреждение. Итак, вы видите, что предупреждение правильно обнаруживает что-то подозрительное в вашем коде.

Фиксированный код:

for (int i = 0; i < 5; i++)
{
    if (array[i] == key)
    {
         // found return & exit loop
         return i;
    }    
}
// not found, end of loop: return -1
return -1;
Другие вопросы по тегам