Функция времени иногда работает, иногда нет

1

Поэтому я пытаюсь сделать функцию времени, которая учитывается. Это было основано на том, что я видел здесь. Переменные задаются из другой функции. По истечении времени переменная finish поворачивается на 1, и она оставляет функцию. Эта функция работает иногда, а иногда она не работает, например, если я даю ей ввод 11sec, он отлично работает, но если я дам ей 1:00 мин, это не сработает. Может кто-то сказать мне, что не так с кодом.

if (time1 == 0 && time2 == 0 && time3 == 0 && time4 == 0)
//if all the time is 0 finish the sequence
    finish = 1;

if (time1 != 0) //Checking to see if the first digit is NOT at 0
    time1 = time1 - 1; //  subtract time 1 by 1
else {
    time2 = time2 - 1;  //When time1 is 0
    time1 = 9;
} //Time1 going back to it original value

if (time2 == 0 && time1 == 0) { //if time1 and time2 are 0s
    if (time3 != 0) { //The minute value (time3)
        time2 = 5;  //60 SECONDS
        time3 = time3 - 1;
        time1 = 9;
    }             
} //Put time 1 to its original value
if (time2 <= 0 && time1 <= 0 && time3 <= 0) {
    if (time4 != 0) { //The minute value (time3)
        time2 = 5; //60 SECONDS
        time3 = 9;
        time4 = time4 - 1;
        time1 = 9; 
    }
} //Put time 1 to its original value

Time4 = 3, Time3 = 2, Time2 = 1, Time1 = 0. Это будет означать, что время составляет 32:10 мин.

  • 9
    Вау, это довольно сложно прочитать: o Это стиль кодирования WTF?
  • 0
    Я программирую на нормальном С, действительно базовая логика
Показать ещё 4 комментария
Теги:
mikroc

2 ответа

3

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

if (time1 > 0)
    time1 -= 1;
if (time3 > 0)
    time3 -= 1;

Другая мысль, вы рассчитываете с каждой цифрой минут и секунд, почему бы просто не использовать секунды, конвертируя свое время в секунды. Например, чтобы пересчитать 1:23:

int minutes = 1;
int seconds = 23;
int timer = minutes * 60 + seconds;

// in your timer function
if (seconds == 0) {
    finish = 1;
} else if (seconds > 0) {
    seconds -= 1;
} else {
      // error
}

Таким образом, это было бы также расширяемо, что, если вы хотите обрабатывать часы, просто добавьте hours * 3600 в seconds, вы можете сделать это легко, чтобы обрабатывать дни, даже месяцы. В вашем подходе добавить те, которые приведут к слишком большому числу случаев, их почти невозможно обработать правильно.

  • 0
    спасибо за предложение превратить время в секунды, я применил эту логику, и она отлично работает. Еще раз ваша помощь очень ценится.
  • 0
    @Badprogrammer рад знать, что это помогло.
Показать ещё 4 комментария
2

Проблема в том, что вы сравниваете ноль после того, как изменили число на ненулевое.

Предполагая, что 1:00 кодируется как

time1 = 0
time2 = 0
time3 = 1

вы можете следовать своей логике:

if (time1 != 0) // Nope
    time1 = time1 - 1;
else { // Yes
    time2 = time2 - 1;
    time1 = 9;
}

Теперь у вас есть

time1 == 9
time2 == 0
time3 == 1

if (time2 == 0 && time1 == 0) { // Nope, time1 is 9
    if (time3 != 0) {
        time2 = 5;  
        time3 = time3 - 1;
        time1 = 9;
    }             
}

и у вас все еще есть

time1 == 9
time2 == 0
time3 == 1

и наконец

if (time2 <= 0 && time1 <= 0 && time3 <= 0) { // Nope
    if (time4 != 0) { 
        time2 = 5; 
        time3 = 9;
        time4 = time4 - 1;
        time1 = 9; 
    }
}

так что в итоге

time1 == 9
time2 == 0
time3 == 1

то есть 1:09.

Единственный раз, когда вы хотите изменить время k, - это когда время k-1 "пересекло" ноль.
Это можно сделать с помощью гнезда условных выражений:

if (time1 > 0 || time2 > 0 || time3 > 0 || time4 > 0)
{    
    time1 -= 1;
    if (time1 < 0)
    {
        time1 = 9;
        time2 -= 1;
        if (time2 < 0)
        {
            time2 = 5;
            time3 -= 1;
            if (time3 < 0)
            {
                // ...
            }
        }
    }
}
  • 0
    Ахахах, это имеет смысл. Я бы попытался отладить его сам, но, к сожалению, отладчик на MikroC не так хорош, как отладчик на Visual Studio. Еще раз спасибо за вашу помощь
  • 0
    @Badprogrammer Вам не нужен отладчик для подобных проблем. Вам нужно только базовое понимание хода программы и несколько минут на обдумывание.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню