我有以下课程
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;
处发生奇怪错误,因为_X
被赋值为1051372203
而不是0.33333334f
答案 0 :(得分:8)
所有属性,特别是_X和_Y,都是为编译器保留的,并且编译器使用_X(因为它太短)并不可能用于其他事情并使代码混淆。
C ++语言保留以实现的下划线开头的名称子集。在这种情况下,所有范围/案例都保留下划线和主要资本。规则并不是非常复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上引入下划线。
答案 1 :(得分:5)
位模式1051372203,0x3eaaaaab
是IEEE754格式中float
值1.0f/3
的位模式。因此赋值工作,并且在某些地方,位模式被解释为整数。对于i == 0
,int
(或unsigned int
)0和float
0的位模式相同。
无法从发布的代码中推断出发生这种情况。
答案 2 :(得分:-1)
对于数组中的每个视口,您必须调用构造函数(创建对象):
for(uint i = 0; i < _NumCascades; i++)
{
vps[i] = ViewPort();
}
您还需要实现构造函数并为类中的所有属性赋值,例如: 0
。在划分1.0f/_NumCascades
之前,您应该使用_NumCascades
将float
转换为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);
现在,你有一个指针数组,它们可能指向内存中的随机位置,因此是随机值。