Таймер работает неправильно - PullRequest
0 голосов
/ 27 октября 2010

У меня проблема с классом таймера, основанным на таймере SDL.

class CTimer
{
    public:
    CTimer(): startTick(0), endTick(0), curTime(0), running(false) {};
    void Start() { startTick += SDL_GetTicks() - endTick; running = true; };
    void Stop() { endTick = SDL_GetTicks(); running = false; };
    void Reset() { startTick = 0; endTick = 0; curTime = 0; };
    inline int operator()() { return running ? curTime = ((int) SDL_GetTicks - startTick) / 1000 + 1 : curTime; };
    private:
    int startTick;
    int endTick;
    int curTime;
    bool running;
};

Оператор () должен возвращать время в секундах (хранится в curTime). Но он всегда возвращает 4202 (curTime всегда равен этому). Что я делаю не так?

Тестовый код:

int main()
{
    SDL_Init (SDL_INIT_TIMER);
    CApp::CTimer timer;
    timer.Start();
    for (int i = 0; i < 15; ++i)
    {
        SDL_Delay (1000);
        std::cout << timer() << '\n';
    }
    return 0;
}

Ответы [ 4 ]

3 голосов
/ 27 октября 2010

Это прекрасный пример того, почему вы не хотите использовать C-броски старого стиля в C ++.

(int) SDL_GetTicks

Отсутствующие скобки в вызове функции означают, что вы приводите указатель на функцию к типу int, а не к возвращаемому значению. Удивительно, но указатель на функцию никогда не меняется.

1 голос
/ 27 октября 2010

Для начала

inline int operator()() { return running ? curTime = 
    ((int) SDL_GetTicks - startTick) / 1000 + 1 : curTime; };

должно быть

inline int operator()() { return running ? curTime = 
    ((int) SDL_GetTicks() - startTick) / 1000 + 1 : curTime; };

Я бы подумал.

Получили ли вы предупреждение об этом?

1 голос
/ 27 октября 2010

Вам не хватает скобок для SDL_GetTicks?

inline int operator()() { return running ? curTime = ((int) SDL_GetTicks - startTick) / 1000 + 1 : curTime; };
0 голосов
/ 27 октября 2010

В дополнение к попытке вызова SDL_GetTicks вместо SDL_GetTicks(), в результате чего он получает адрес этой функции (и всегда возвращает константу, как вы наблюдали), похоже, если вы вызовете Start, а затем Stop перед тем, как позвонить operator(), вы не получите значимого результата.

...