2012-08-31 43 views
1

我有下面的类不正确的浮子asignment

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

+0

在我的机器上正常工作,在某些特定的编译器版本中看起来像是一个晦涩难懂的错误太严重了。这段代码究竟是导致这种奇怪行为还是简化版本? – Gorpik

+3

设置_X和_Y应该工作。然而,使用operator- =来表示宽度和高度很奇怪。 – Mehrwolf

+2

这是你的全部代码吗?你没有'main'函数,uint'不是我所知的类型。你能发布一个完整的可编译示例来展示你的问题吗? – Kevin

回答

8

所有的属性,特别是_X和_Y,都是为编译器保留的,并且编译器使用_X(因为它非常短)以及让代码感到困惑并不是不可能的。

C++语言保留一个以下划线开头的名称的子集。在这种情况下,所有范围/案例中都保留下划线和一个领先的资本。规则不是非常复杂,但为了防止意外地使用保留名称,最简单的办法是避免在标识符上引用下划线。

-1

对于每个视口里面数组,你必须调用构造函数(创建对象):

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

您还需要实现的建设者和分配你的类中的所有属性的值,例如0。将1.0f/_NumCascades之前,您应该投你_NumCascadesfloat使用static_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); 

现在,你有一个指针,它在内存中的任意地方可能指向数组,所以随机值。

5

1051372203,0x3eaaaaab的位模式是IEEE754格式的float1.0f/3的位模式。所以赋值是有效的,并且在某个地方,位模式被解释为一个整数。对于i == 0int(或unsigned int)0和float 0的位模式是相同的。

发生的情况无法从发布的代码中推断出来。

+0

+1很好看 –