Member 12919791 Ответов: 3

Ошибка в функции bool с циклом for


Я не уверен, почему я получаю эту ошибку. Я проверил скобки и скобки. Петля не должна продолжаться вечно.

Error: helpers.c:43:1: error: control may reach end of non-void function [-Werror,-Wreturn-type] } ^

PS: В моем случае я должен использовать Werror.

Спасибо

Что я уже пробовал:

bool search(int value, int values[], int n) 
{
 if ( n < 0)
 { return false; }

for (int a = 0; a < n; a++)
{
    if ( values[a] == value)
    {
        return true;
        break;
    }

    else
    {
        if ( a == n)
        {
            return false;
        }
    }
}
}

[no name]

Что будет возвращать ваша функция, если n = 0?

Member 12919791

Да, я этого не помню.

Теперь я изменил код в начале, чтобы рассмотреть if (n <= 0).

И все же происходит та же ошибка.

Большое спасибо,

cvogt61457

Компилятор умен, но есть ситуации, которые могут обмануть его.
Ваш код выглядит так, как будто он может выйти без возврата - следовательно, у вас есть предупреждение.
Цикл может фактически завершиться и выйти вместе с
если (a == n)
но компилятор не может этого понять.
Решение Ричарда Маккатчана выглядит красиво и легко читается.
Примечание:
Ясность очень ценится при написании кода. Техническое обслуживание намного проще, и другие могут получить представление о том, как
то, что вы хотите сделать, гораздо проще.
Поцелуй-Держи это просто глупо

3 Ответов

Рейтинг:
23

Richard MacCutchan

Ваш search функция требует return заявление в конце. Кроме того, вам не требуется break заявление после return На самом деле вам не нужен первый if или else вообще-то, все, что вам нужно, это:

bool search(int value, int values[], int n) 
{
    for (int a = 0; a < n; a++)
    {
        if ( values[a] == value)
        {
            return true;
        }
    }
    return false;
}


Рейтинг:
19

Dave Kreskowiak

Ваш код внутри for цикл в лучшем случае хаотичен и не нуждается в else положение о if заявление. Ваша функция не возвращает значение на всех путях кода. Что произойдет, если цикл завершится, не удовлетворяя ни одному из условий, которые вы задали в них if заявления? Компилятор не может понять этого и не может предположить, что for цикл никогда не завершится.

Вы должны переписать этот код, чтобы установить возвращаемое значение, а не просто прямо вернуться из цикла. Например:

bool search(int value, int values[], int n) 
{
    // The default is to return false.
    bool returnValue = false;

    // Is the n parameter OK?
    if ( n >= 0)
    {
        // Yes, so execute the search.
        for (int a = 0; a < n; a++)
        {
            if (values[a] == value)
            {
                returnValue = true;
                break;
            }
        }
    }

    return returnValue;
}


Рейтинг:
0

Patrice T

Цитата:
Ошибка: помощники.З.:43:1: ошибка: элемент управления может достичь конца не void функции [-Werror,-Wreturn-тип] } ^

Вы получаете это сообщение об ошибке, потому что можно достичь конца функции, не сталкиваясь с return
for (int a = 0; a < n; a++)
{
    if ( values[a] == value)
    {
        return true;
        break;
    }

    else
    {
        if ( a == n)
        {
            // This line will never execute because a is never equal to n inside the loop
            return false;
        }
    }
}