基于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;
}
答案 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
。