2016-10-01 13 views
-4

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

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; 
     } 
    } 
} 
+0

Там не применяется погрешность не возвращает значения из не-пустоты функции здесь. Там * может * быть (некорректным) компилятором * warning *. Очевидная ошибка в вашем коде в другом месте. – EOF

+0

Возможно, ошибка относится к возврату значения из 'main' (а компилятор находится в режиме pre-C99). Сообщение об ошибке должно содержать связанный с ним номер строки. –

ответ

1

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

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

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

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; 
+0

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