我对变量有一个非常奇怪的问题。在OPENGL渲染循环中几次调用之后,一个变量没有任何原因改变其值(verticesSize
)而第二个变量(verticesSize2)不...
相反,当我在程序的任何其他位置循环它们(使用for)时,它们都保持正确的值。
无论我如何命名第一个变量,它总是更改其值,因此它必须是内存问题,但我不知道是什么原因导致它。有什么想法吗?
CPP。文件
void CosmicBody::InitShape(unsigned int uiStacks, unsigned int uiSlices, float fA, float fB, float fC)
{
float tStep = (Pi) / (float)uiSlices;
float sStep = (Pi) / (float)uiStacks;
float SlicesCount=(Pi+0.0001)/tStep;
float StackCount=(2*Pi+0.0001)/sStep;
this->verticesSize=((int) (SlicesCount+1) * (int) (StackCount+1))*2;
this->verticesSize2=((int) (SlicesCount+1) * (int) (StackCount+1))*2;
}
的main.cpp
#include ....
CosmicBody one;
void renderScene(void)
{
std::cout<<one.verticesSize<<endl;
std::cout<<one.verticesSize2<<endl;
fps.calculateFPS(clock.elapsedTime);
glutSwapBuffers();
}
修改
好的,我发现哪一行导致了问题
在这个函数函数sprintf
使程序运行不正确。为什么另一个类的函数导致这个?
void FpsCalc :: calculateFPS(unsigned int currentTime)
{
frameCount++;
int timeInterval = currentTime - previousTime;
if(timeInterval > 1000)
{
float fps = frameCount / (timeInterval / 1000.0f);
previousTime = currentTime;
frameCount = 0;
sprintf(this->fps,"%f",fps); //this line makes mess
}
}
#ifndef FPSCALC_H
#define FPSCALC_H
class FpsCalc
{
private:
int frameCount;
float previousTime;
public:
FpsCalc();
void calculateFPS(unsigned int currentTime);
char fps[5];
~FpsCalc(){};
};
#endif
答案 0 :(得分:1)
fps
缓冲区不足以容纳结果输出,导致未定义的行为:
sprintf(this->fps,"%f",fps);
我不确定默认精度,但在我的机器上:
float f = 1.1f;
产生
1.100000
这是9个字符(7位数,句点和空终止符)。
您需要指定精度:
sprintf(this->fps, "%.2f", fps);
或者这是C ++,而是使用std::ostringstream
和std::string
。
std::string fps;
...
float fps = frameCount / (timeInterval / 1000.0f);
std::ostringstream s;
s << fps;
this->fps = s.str();