Переключение между значениями перечисления: C

#c #enums #switch-statement

#c #перечисления #оператор переключения

Вопрос:

Надеюсь, это будет простой вопрос. Я мало имел дело с перечислениями, поэтому не до конца понимаю, как они работают. В моей программе я пытаюсь сохранить задание игрока в перечислении. Мне нужна функциональность, с помощью которой задание может быть изменено. Я пытаюсь использовать оператор switch, но это не меняет работу проигрывателя.

Код:

 // if change is True, change the job. If false, simply return the current value
int GameModeState::changeJob(bool change)
{
    int job = Landman; // Default job is landman
    if (change == true)
    {
        switch(job)
        {
        case Landman:
            return job;
            break;
        case Geologist:
            return job;
            break;
        default:
            job = Landman;
            return job;
            break;
        }
    } 
    else 
    {
        return job;
    }
}

// when the player opens the stat sheet, it should change their job
void GameModeState::_statsheet()
 {
     changeJob(true);
 }
  

Что я делаю не так, чтобы изменить задания? Я думаю, проблема в инструкции switch.

Комментарии:

1. Что вы подразумеваете под «это не меняется»? Вы возвращаете разные значения job , но затем игнорируете возвращаемое значение.

2. В чем ошибка? Здесь я просто вижу, что вы всегда назначаете job Ландману.

3. Я не знаю, как вернуть новое значение job … то есть, я не знаю, что делает мой оператор switch… Я хочу, чтобы он вернул новое задание, но, видимо, мое «значение по умолчанию» превосходит его?

4. Несмотря ни на что, вы просто возвращаетесь Landman . Какова цель инструкции switch , если каждый случай возвращает одно и то же значение?

5. @mahesh Как мне не «несмотря ни на что» вернуть Landman? Я просто хочу, чтобы Landman был по умолчанию, если они не выбирают задание в начале игры.

Ответ №1:

Ваша логика неверна. switch(job) Инструкция приводит вас к вашему варианту изложения. В

 case Landman
  

Вы немедленно возвращаете Landman (поскольку вы устанавливаете job в значение Landman перед выполнением вашего оператора switch, он ВСЕГДА будет возвращать Landman таким, каким вы его закодировали), что полностью возвращает вас из этой функции. Он никогда не пытается сменить задание на любое ДРУГОЕ задание. Обратите внимание, что ваши инструкции break также никогда не выполняются, поскольку return немедленно возвращает вас из этого вызова функции. Вы, вероятно, хотите этого:

 case Landman:
   job = geologist;
   return job;
  

И так далее, и тому подобное. Кроме того, вы жестко кодируете вариант задания по умолчанию для Landman. Вероятно, вы захотите либо передать в качестве переменной, либо прочитать из объекта, каково ТЕКУЩЕЕ значение Job на листе воспроизведения, а затем скорректировать его на основе текущего значения.

Комментарии:

1. Снова привет, J_D. Какую логику мне нужно использовать, чтобы переключать задания?

2. Смотрите мою правку — Вам нужно прочитать текущее значение job из таблицы проигрывателя. Затем используйте это в своем операторе switch. переключение (CurrentJob).. Затем, если вы нажмете на case geologist, вы измените свою таблицу символов. задание Ландману. Похоже, что вы на самом деле нигде не фиксируете и не сохраняете это значение задания, и вы не сохраняете возвращаемое значение вашей функции в вызове _statSheet() . Вам нужно либо зафиксировать возвращаемое значение, либо заставить функцию напрямую обновлять ваш объект StatSheet в памяти, чтобы изменение было сохранено.

3. Это помогло мне двигаться в правильном направлении. Я попрошу моего парня помочь мне закончить. Спасибо, J_D!

Ответ №2:

Оператор switch работает нормально. У вас есть куча бесполезных инструкций break, но они не вызывают проблем (за исключением того, что делают код менее читаемым).

В этом проблема:

 // if change is True, change the job. If false, simply return the current value
  

job это локальная переменная, единственным результатом ее установки является более поздний return job; оператор. Ваш комментарий должен гласить:

 // if change is true, return the new job. If false, simply return the current value
  

Возвращается новое значение job , но вы отбрасываете возвращаемое значение.

Конечно, вы всегда устанавливаете job = Landman , что означает, что вы всегда используете один и тот же путь через switch . Вся функция эквивалентна return Landman; .

Комментарии:

1. Эх, как бы мне вернуть новое задание? ;_;

2. @Briz: Вы, вероятно, ищете переменную-член, инициализированную в конструкторе и затем используемую в других функциях. Но неясно, что вы хотите сделать, потому что вы не описали это, все, что вы предоставили, это код, который делает то, чего вы не хотите.