计时器工作不正常

时间:2010-10-27 19:05:25

标签: c++ timer sdl

基于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 个答案:

答案 0 :(得分:3)

这是一个很好的例子,说明为什么你不想在C ++中使用旧式的C语言。

(int) SDL_GetTicks

函数调用中缺少的括号表示您将函数的指针转换为int,而不是返回值。令人惊讶的是,指向函数的指针永远不会改变。

答案 1 :(得分:1)

您是否缺少SDL_GetTicks的括号?

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

答案 2 :(得分:1)

首先,

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; };

我会想。

您是否收到有关此问题的警告错误?

答案 3 :(得分:0)

除了尝试调用SDL_GetTicks而不是SDL_GetTicks()导致它获取该函数的地址(并且总是按照您观察到的那样返回常量)之外,看起来如果调用{{在调用Start之前,你会得到一个有意义的结果,然后再Stop