在我的编译器上,以下伪代码(用二进制替换的值):
sint32 word = (10000000 00000000 00000000 00000000);
word >>= 16;
Run Code Online (Sandbox Code Playgroud)
生成一个如下所示word的位域:
(11111111 11111111 10000000 00000000)
Run Code Online (Sandbox Code Playgroud)
我的问题是,我可以依赖所有平台和C++编译器的这种行为吗?
函数glGenBuffers()/ glBufferData()/ etc和附加到函数名称glGenBuffersARB()/ glBufferDataARB()/等的ARB 函数之间有什么区别.我试着四处寻找,但没有人指出差异,只是他们只是使用其中一个.
此外,某些计算机上的任一功能都不可用吗?在不退回到即时模式的情况下,绕过这种情况的最常见方法是什么?
假设我有两个浮点数,我想比较它们.如果一个大于另一个,程序应该采用一个分叉.如果情况恰恰相反,那么应采取另一条道路.并且它应该做同样的事情,如果被比较的值被轻微地推向一个方向,仍然应该比较真实.
这是一个难以解释的问题,所以我写这篇文章来证明它 -
float a = random();
float b = random(); // always returns a number (no infinity or NaNs)
if(a < b){
if( !(a < b + FLOAT_EPISILON) ) launchTheMissiles();
buildHospitals();
}else if(a >= b){
if( !(a >= b - FLOAT_EPISILON) ) launchTheMissiles();
buildOrphanages();
}else{
launchTheMissiles(); // This should never be called, in any branch
}
Run Code Online (Sandbox Code Playgroud)
鉴于此代码,launchTheMissiles()保证永远不会被调用?
使用我的2D物理系统(box2D)和OpenGL,conplex多边形需要分解为凸多边形.确保模型符合这一点很容易.但是,我还想在模拟过程中编辑多边形,因此我需要一种动态方法将现有多边形压缩成更多仍然凸起的多边形.
我希望这张图有助于描述我追求的内容:

我的问题是,是否有现成的图书馆可以实现这一目标?如果没有,那么自己最不容易出错的方法是什么?
(我正在浏览Boost,它有一个Geometry和一个Polygon模块,但是文档证明有点太深奥了,我不知道是否可以做我想要的.)
// value will always be in the range of [0.0 - maximum]
float obtainRatio(float value, float maximum){
if(maximum != 0.f){
return value / maximum;
}else{
return 0.f;
}
}
Run Code Online (Sandbox Code Playgroud)
范围maximum可以是任何东西,包括负数.范围value也可以是任何东西,但是当输入在范围内时,该功能仅需要"有意义" [0.0 - maximum].输出应始终在范围内[0.0 - 1.0]
我有两个问题,我想知道,有这个:
我想将一个函数的地址赋给一个函数指针,但是要处理的函数返回一个与自身具有相同签名的函数指针,导致它以一种我根本无法写入返回类型的方式递归,因为函数指针甚至函数声明本身......
我想一种简化问题的方法,所以它不会混淆:
我怎么能写一个函数声明,它可以返回一个指向自身的指针(或任何其他具有相同签名的函数)?
????? function(int a){
// could be this function, or another with the same signature,
return arbitraryFunction;
}
?????(*func)(int) = function; // same problem as above
Run Code Online (Sandbox Code Playgroud)
编辑:
现在我有一个解决方案,但我不会将其作为答案发布,因为它非常难看.它通过简单地返回原始void*指针作为返回类型来消除递归,并最终采用以下形式:
void* function(int parameter){
return arbitraryFunction; // of the same signature
}
void*(*func)(int) = function;
func = reinterpret_cast<void*(*)(int)>(func(42)); // sin
Run Code Online (Sandbox Code Playgroud)
EDIT2:
似乎在函数指针和常规指针之间进行转换是UB,所以void*在这种情况下我无法使用...
要回答其中一条注释,这是为了在程序中的多个"主"循环之间传递控制,每个循环都获得它自己的功能.有很多方法可以做到这一点,但返回函数指针(或NULL来终止程序)mid-loop 似乎是最简单的方法,但我没想到指向数据的指针和指向函数地址的指针与每个指针都不相容其他.我认为在这种情况下,返回多态函数对象将最终成为更合理的选项.
只是一个风格问题......
我是一个独立的低级独立游戏开发者,我自己开发了我所说的是在我的标题中编写整个课程的"坏"习惯.我知道.h/.cpp文件组合的一些好处是它们允许将代码拆分成编译块,只要它们保持不变,就不需要重新编译.并允许从实现中分离接口.
但是,这些都不会对我有任何好处,因为我倾向于将我的实现放在一个可以轻松改进,更改,阅读的地方.我的编译时间几乎是即时的(2-4秒,如果我将SFML或Box2D更新到他们的最新版本并且他们也需要重新编译,则为15秒)
像这样的编码一直在为我节省了相当多的时间,而且由于文件较少,我的代码对我来说感觉不那么"压倒性".
但鉴于此,并且总的来说,对于一个小项目的每个"file.h"设置,是否有任何令人信服的理由遵循"file.cpp",其中编译时间和接口/实现分离不是优先级?
假设我有两个不同的类,它们以相同的内部方式表示2D坐标数据,如下所示:
class LibA_Vertex{
public:
// ... constructors and various methods, operator overloads
float x, y
};
class LibB_Vertex{
public:
// ... same usage and internal data as LibA, but with different methods
float x, y
};
void foobar(){
LibA_Vertex * verticesA = new LibA_Vertex[1000];
verticesA[50].y = 9;
LibB_Vertex * verticesB = reinterpret_cast<LibB_Vertex*>( vertexA );
print(verticesB[50].y); // should output a "9"
};
Run Code Online (Sandbox Code Playgroud)
鉴于两个类是相同的并且上面的函数,我可以可靠地指望这个指针转换在每种情况下按预期工作吗?
(背景是,我需要一种简单的方法来交换具有相同Vertex类的两个独立库之间的顶点数组,我想避免不必要地复制数组).
我有一个列表,希望不同的线程从中获取元素。为了避免在列表为空时锁定保护该列表的互斥锁,请empty()在锁定之前进行检查。
如果对电话的呼叫在list::empty()100%的时间内都不正确,则可以。我只想避免崩溃或中断并发list::push()和list::pop()调用。
我是否可以肯定地认为VC ++和Gnu GCC有时只会empty()出错并且没有比这更糟的了?
if(list.empty() == false){ // unprotected by mutex, okay if incorrect sometimes
mutex.lock();
if(list.empty() == false){ // check again while locked to be certain
element = list.back();
list.pop_back();
}
mutex.unlock();
}
Run Code Online (Sandbox Code Playgroud) 找到2的幂的最快方法是什么,使用一定数量(即2的幂)?
我对数学不是很熟练,所以我不确定如何最好地描述它.但功能将类似于x = 2^y这里y是输出,并且x是输入.这是一个真实表,如果有助于解释它的外观.
0 = f(1)
1 = f(2)
2 = f(4)
3 = f(8)
...
8 = f(256)
9 = f(512)
Run Code Online (Sandbox Code Playgroud)
我已经做了一个这样做的功能,但我担心它不是很有效(或者说优雅).这样做会有更简单,更有效的方法吗?我正在使用它来计算纹理的哪个区域用于缓冲绘制的完成方式,因此每个绘制的对象至少调用一次.这是我到目前为止所做的功能:
uint32 getThePowerOfTwo(uint32 value){
for(uint32 n = 0; n < 32; ++n){
if(value <= (1 << n)){
return n;
}
}
return 32; // should never be called
}
Run Code Online (Sandbox Code Playgroud)