Не удается выйти из цикла - PullRequest
2 голосов
/ 24 октября 2019

Я хочу выйти из цикла «Пока», когда переменная «длительность» достигает 5 с.

Переменная «длительность» всегда = 0

#include <iostream>
#include <Windows.h>
#include <chrono>

using namespace std;
DOUBLE duration;


int main()
{

    using clock = std::chrono::system_clock;
    using sec = std::chrono::duration <double>;
    const auto before = clock::now();
    while (duration < 5.0)     
    {
        const auto after = clock::now();
        const sec duration = after - before;
        std::cout << "It took " << duration.count() << "s" << std::endl;

    }
    std::cout << "After While Loop ";  //Never reaches this line!!!!!
    return 0;
}

Фактический результат:.
.
потребовалось 9.50618 с
это инструмент 9.50642 с
.
Я ожидал выхода из цикла на уровне 5.0 или выше.

переменная дисплея всегда показывает 0.

Ответы [ 3 ]

3 голосов
/ 24 октября 2019

У вас есть две переменные, называемые продолжительностью:

DOUBLE duration;

и в цикле while:

const sec duration = after - before;

Во время вычисления оператора while вы проверяете первую, которая никогда не устанавливаетсяили изменился. Внутри while тела цикла вы создаете новую переменную, которая скрывает глобальную переменную. См. https://en.wikipedia.org/wiki/Variable_shadowing

. Вместо этого вам не следует объявлять новую переменную, а использовать ее, объявленную перед входом в цикл while.

3 голосов
/ 24 октября 2019

Здесь есть две проблемы:

  1. Объявление локальной переменной с тем же именем, что и у глобальной переменной, делает их двумя отдельными объектами, что может привести к путанице. Это явление называется Затенение переменной .

  2. Вы сравниваете переменную duration, которая на самом деле является объектом класса secи не является целым числом или числом с плавающей запятой . Итак, для сравнения значения в duration просто сделайте duration.count(), чтобы сделать его сопоставимым с целочисленными значениями или значениями с плавающей запятой.

Здесь, в вашем коде, глобальная переменная duration никогда не изменяется, поскольку вы объявляете новую переменную внутри цикла while. Переменная duration, которая была проверена в условии while, является глобальной переменной duration, но вы ожидаете, что она будет переменной продолжительности внутри цикла.

Существует два возможных решения:

  1. Либо сделайте две переменные duration одинаковыми.

  2. Или прервать цикл while(1), когда значение переменной удержания duration >= 5,

Код решения 1 выглядит следующим образом:

#include <iostream>
#include <Windows.h>
#include <chrono>

using namespace std;

int main()
{

    using clock = std::chrono::system_clock;
    using sec = std::chrono::duration <double>;
    sec duration;
    const auto before = clock::now();
    while (duration.count() < 5.0)
    {
        const auto after = clock::now();
        duration = after - before;
        std::cout << "It took " << duration.count() << "s" << std::endl;
    }
    std::cout << "After While Loop ";  //Never reaches this line!!!!!
    return 0;
}

Код решения 2 выглядит следующим образом:

#include <iostream>
#include <Windows.h>
#include <chrono>

using namespace std;

int main()
{

    using clock = std::chrono::system_clock;
    using sec = std::chrono::duration <double>;
    const auto before = clock::now();
    while (1) // Soln 1: while(1)
    {
        const auto after = clock::now();
        const sec duration = after - before;
        std::cout << "It took " << duration.count() << "s" << std::endl;
        if(duration.count() >= 5) 
            break;
    }
    std::cout << "After While Loop ";  //Never reaches this line!!!!!
    return 0;
}
3 голосов
/ 24 октября 2019

Вы используете две отдельные переменные с именем duration.

using sec = std::chrono::duration <double>; // number 1
const auto before = clock::now();
while (duration < 5.0) // checking number 1, which is not changed during looping    
{
    const auto after = clock::now();
    const sec duration = after - before; // number 2, created afresh in each iteration 
    std::cout << "It took " << duration.count() << "s" << std::endl;

}

Итак, вы проверяете в условии цикла не то, что изменяется в теле цикла.

...