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 == 1i==2在线_X = x;,因为_X被分配了值1051372203而不是0.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,您应该将您的_NumCascades转换为floatusingstatic_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 回答