C++ 不正确的浮动定位
我有以下课程C++ 不正确的浮动定位,c++,C++,我有以下课程 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
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();
无效设置大小(浮动x、浮动y);
私人:
浮动X;
浮动;
};
无效视口::设置大小(浮动x、浮动y)
{
//用于确保视口保持在[0.0f,1.0f]范围内的条件
如果(x<0.0f)
_X=0.0f;
如果(x>1.0f),则为else
_X=1.0f;
其他的
_X=X;
如果(y<0.0f)
_Y=0.0f;
如果(y>1.0f),则为else
_Y=1.0f;
其他的
_Y=Y;
}
我创建了视口的矢量
Viewport vps[3];
uint _NumCascades = 3;
for(uint i = 0; i < _NumCascades; i++)
vps[i].setSize(i * (1.0f/_NumCascades), 0.0f);
Viewport-vps[3];
uint _NumCascades=3;
对于(uint i=0;i<\u NumCascades;i++)
vps[i].设置大小(i*(1.0f/_NumCascades),0.0f);
当
i==1
和i==2
第\ux=X行出现奇怪的错误时
因为\u X
为数组中的每个视口分配了值1051372203
,而不是0.3333333 4f
,因此必须调用构造函数(创建对象):
现在,您有一个指针数组,它可能指向内存中的随机位置,因此是随机值。对于数组中的每个视口,您必须调用构造函数(创建对象):
现在,您有一个指针数组,它可能指向内存中的一个随机位置,因此是随机值。1051372203,
0x3eaaaab
的位模式是IEEE754格式的浮点值1.0f/3
的位模式。因此赋值是有效的,在某些地方,位模式被解释为一个整数。对于i==0
,int
(或unsigned int
)0和float
0的位模式相同
从发布的代码中无法推断发生这种情况的位置。1051372203的位模式,0x3eaaaaab
是IEEE754格式的浮点值1.0f/3
的位模式。因此赋值是有效的,在某些地方,位模式被解释为一个整数。对于i==0
,int
(或unsigned int
)0和float
0的位模式相同
发生这种情况的地方不能从发布的代码中推断出来。您的所有属性,尤其是X和Y,都是为编译器保留的,而且编译器使用X(因为它很短)来表示其他内容并使您的代码变得混乱并非不可能
C++语言保留了一个名称的子集,该名称从下划线开始。在这种情况下,所有作用域/大小写中都保留下划线和前导大写字母。规则并不十分复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上完全使用下划线。
所有属性,尤其是X和Y,都是为编译器保留的,编译器使用X(因为它很短)也不是不可能的为了其他的东西,让你的代码变得混乱
C++语言保留了一个名称的子集,该名称从下划线开始。在这种情况下,所有作用域/大小写中都保留下划线和前导大写字母。这些规则并不十分复杂,但为了防止意外使用保留名称,最简单的方法是避免在标识符上完全引入下划线。
在我的机器上运行良好,而且在某些特定的编译器版本中,这看起来是一个非常严重的错误,不可能只是一个模糊的错误。这段代码正是导致这种奇怪行为的代码,还是只是一个简化版本?设置X和Y应该可以工作。然而,对宽度和高度使用运算符-=是很奇怪的。这就是您的全部代码吗?您没有main
函数,而且就我所知,uint
不是一种类型。您能否发布一个完整的可编译示例来演示您的问题?鉴于您的所有属性,尤其是\ux
和\uy
,都是为编译器保留的,因此编译器使用\ux
进行其他操作并使您的代码混淆并非不可能。请不要在你的名字中使用前导下划线。@Gorpik是的,这是我的代码的简化版本,因为我的程序太复杂了,我也尝试过编译这个简化版本,它工作正常。。。我将尝试缩小产生错误的代码范围。在我的机器上运行良好,而且在某些特定的编译器版本中,这看起来是一个非常严重的错误,不可能只是一个模糊的错误。这段代码正是导致这种奇怪行为的代码,还是只是一个简化版本?设置X和Y应该可以工作。然而,对宽度和高度使用运算符-=是很奇怪的。这就是您的全部代码吗?您没有main
函数,而且就我所知,uint
不是一种类型。您能否发布一个完整的可编译示例来演示您的问题?鉴于您的所有属性,尤其是\ux
和\uy
,都是为编译器保留的,因此编译器使用\ux
进行其他操作并使您的代码混淆并非不可能。请不要在你的名字中使用前导下划线。@Gorpik是的,这是我的代码的简化版本,因为我的程序太复杂了,我也尝试过编译这个简化版本,它工作正常。。。我将尝试缩小产生错误的代码范围。
for(uint i = 0; i < _NumCascades; i++)
{
vps[i] = ViewPort();
}
vps[i].setSize(static_cast<float>(i) * (1.0f/static_cast<float>(_NumCascades)), 0.0f, 1.0f/static_cast<float>(_NumCascades), 1.0f);