Nano Hash - криптовалюты, майнинг, программирование

Что означает предупреждение: не все пути управления возвращают значение? (С++)

Точное предупреждение, которое я получаю,

warning C4715: 'hand::show' : not all control paths return a value

и hand::show есть

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

где сторона - переменная ориентации типа

orientation{
    left = -1,
    right = 1
};

Что означает это предупреждение и как лучше всего избавиться от него?

30.05.2009

Ответы:


1

Ваш компилятор недостаточно умен, чтобы принять во внимание, что единственными двумя вариантами для side являются left и right, поэтому он считает возможным выполнение ни одного оператора return. Когда side не является ни left, ни right, ваша функция не говорит, какое значение возвращать.

30.05.2009

2

Ошибка означает, что если сторона не является ни левой, ни правой, ваша функция не вернет значение - либо сторона объявлена ​​неправильно, либо ваше перечисление. Перечисление должно быть определено как

enum orientation {left, right};

Поэтому попробуйте изменить свою структуру ориентации на это.

30.05.2009

3

Если side не является left или right, то возвращаемое значение не определено.

Несмотря на то, что orientation является перечислением только с двумя значениями (прямо сейчас), оно может иметь другое значение по любой из следующих причин:

  • В будущем вы можете изменить заголовок, чтобы включить другие значения в перечисление, поэтому защитное программирование предполагает, что это произойдет (и ваш компилятор сейчас мил и предупреждает вас).
  • side может быть неинициализирован, поэтому это не может быть ни left, ни right
  • side могло быть присвоено другое значение посредством приведения типов, например. *((int*)&side) = 2

Возможные решения включают в себя:

  • Замените второй if на else, как предложено sth.
  • Измените его на:

    if(side == left) {
        return ...;
    } else if(side == right) {
        return ...;
    } else {
        ...handle error...
    }
    
30.05.2009

4

Предупреждение означает, что ваш метод можно пройти без возврата какого-либо явного значения. С вашим кодом:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    if(side == right)
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}

если side != left и side != right, то ничего не возвращаете. Обычный способ решения этой проблемы — предположить, например, что если не «слева», то всегда считать «справа»:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
}
30.05.2009

5

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

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    else
    {
        os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
    return os;
}
30.05.2009

6

Чтобы избавиться от предупреждения, замените второй if на else:

std::ostream& hand::show(std::ostream& os) const
{
    if(side == left)
    {
        return os<<display[0]<<display[1]<<display[2]<<display[3]<<display[4];
    }
    else
    {
        return os<<display[4]<<display[3]<<display[2]<<display[1]<<display[0];
    }
}
30.05.2009

7

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

  1. замените второй оператор if на else или удалите условие целиком, так как если сторона не левая, она должна быть правой.
  2. следуйте предложению Натаниэля Флата и измените тип ориентации на перечисление.
  3. вызвать исключение в качестве последнего оператора функции.
30.05.2009
Новые материалы

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

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

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