0

変数に関して非常に奇妙な問題があります。OPENGLレンダリングループで数回呼び出した後、1つの変数はverticesSize理由もなくその値()を変更しますが、2番目の変数(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();
}

編集 OKこの関数関数の問題の原因となる行が見つかりました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
4

1 に答える 1

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();
于 2012-08-22T19:59:27.967 に答える