1

私は次のクラスを持っています

class Viewport
{
public:
    Viewport();
    ~Viewport();

    void setSize(float x, float y);

private:
    float  _X;
    float  _Y;
};

void Viewport::setSize(float x, float y)
{
    //Conditionals used to make sure that the viewport stays inside the [0.0f, 1.0f] range

    if(x < 0.0f)
        _X = 0.0f;
    else if(x > 1.0f)
        _X = 1.0f;
    else
        _X = x;

    if(y < 0.0f)
        _Y = 0.0f;
    else if(y > 1.0f)
        _Y = 1.0f;
    else
        _Y = y;

}

そして、ビューポートのベクトルを作成します

Viewport vps[3];

uint _NumCascades = 3;

for(uint i = 0; i < _NumCascades; i++)
    vps[i].setSize(i * (1.0f/_NumCascades), 0.0f);

の代わりに値が割り当てられているため、行で奇妙なエラーが発生しi == 1ますi==2_X = x;_X10513722030.33333334f

4

3 に答える 3

8

すべての属性、特に_Xと_Yはコンパイラー用に予約されており、コンパイラーが_X(非常に短いため)を他の目的に使用してコードを混乱させている可能性はありません。

C ++言語は、実装のためにアンダースコアで始まる名前のサブセットを予約します。この場合、アンダースコアと先頭の大文字はすべてのスコープ/ケースで予約されています。ルールはそれほど複雑ではありませんが、予約名を誤って使用することを防ぐために、識別子の先頭にアンダースコアを付けるのを完全に避けるのが最も簡単です。

于 2012-08-31T13:46:59.000 に答える
5

1051372203 のビット パターンは、IEEE754形式の値0x3eaaaaabのビット パターンです。そのため、割り当てが機能し、ある場所でビット パターンが整数として解釈されます。の場合、 (または) 0 と 0のビット パターンは同じです。float1.0f/3i == 0intunsigned intfloat

それがどこで起こるかは、投稿されたコードから推測することはできません。

于 2012-08-31T13:13:35.443 に答える
-1

配列内のビューポートごとに、コンストラクターを呼び出す必要があります (オブジェクトを作成します)。

for(uint i = 0; i < _NumCascades; i++)
{
    vps[i] = ViewPort();
}

また、コンストラクターを実装し、クラス内のすべての属性に値を割り当てる必要があります0。分割する前に、インラインキャストを防ぐために使用するように1.0f/_NumCascadesキャストする必要があります。_NumCascadesfloatstatic_cast<>()C++

vps[i].setSize(static_cast<float>(i) * (1.0f/static_cast<float>(_NumCascades)), 0.0f, 1.0f/static_cast<float>(_NumCascades), 1.0f);

現在、ポインタの配列があり、メモリ内のランダムな場所を指している可能性があるため、ランダムな値です。

于 2012-08-31T13:12:43.930 に答える