Jus*_*avy 1 c++ runtime-error bit-shift bitwise-or c++14
所以,我仍在学习按位运算,无法弄清楚为什么会发生此错误。我在谷歌上搜索过它,看起来这个错误可能是在弄乱堆栈时发生,或者在某些情况下,它与 CPU 架构有关。我试过用不同的标志进行编译,这些标志应该有帮助,但我无法让它工作。
这是快速的代码:
int corners = 0;
for (int i = 0; i < 8; i++)
{
const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
const float density = Density_Func(vec3(cornerPos));
const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
corners |= (material << i);
}
Run Code Online (Sandbox Code Playgroud)
并且错误“非法指令(核心转储)”发生在该行
corners |= (material << i);
这是调试器的输出:
Signal received: SIGILL (Illegal instruction) For program, pid 26,118
Run Code Online (Sandbox Code Playgroud)
我将给出这个循环的输出(它永远不会超过第一个循环)。这是 couts 的代码:
int corners = 0;
std::cout<<"corners(outside loop): "<<corners<<std::endl;
for (int i = 0; i < 8; i++)
{
const ivec3 cornerPos = leaf->min + CHILD_MIN_OFFSETS[i];
std::cout<<"cornerPos.x: "<<cornerPos.x<<std::endl;
std::cout<<"cornerPos.y: "<<cornerPos.y<<std::endl;
std::cout<<"cornerPos.z: "<<cornerPos.z<<std::endl;
const float density = Density_Func(vec3(cornerPos));
std::cout<<"density: "<<density<<std::endl;
const int material = density < 0.f ? MATERIAL_SOLID : MATERIAL_AIR;
std::cout<<"material: "<<material<<std::endl;
std::cout<<"MATERIAL_SOLID: "<<MATERIAL_SOLID<<std::endl;
std::cout<<"MATERIAL_AIR: "<<MATERIAL_AIR<<std::endl;
std::cout<<"i: "<<i<<std::endl;
corners |= (material << i);
std::cout<<"corners(inside loop): "<<corners<<std::endl;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
[corners(outside loop): 0] [cornerPos.x: -32] [cornerPos.y: -32] [cornerPos.z: -32] [density: -30] [material: 1] [MATERIAL_SOLID: 1] [MATERIAL_AIR: 0] [i: 0]
Run Code Online (Sandbox Code Playgroud)
我将不胜感激有人能给我关于为什么会发生这种情况的任何见解,如果有明确的原因,如何解决问题。
谢谢!
“非法指令”表示 CPU 试图执行不理解的指令。如果您使用 CPU 不支持的指令集编译程序,则可能会发生这种情况。这个地方的崩溃可能表明使用了 BMI2 位移指令(它在也支持 AVX2 的 CPU 上受支持)。请检查您的编译选项。
另一种可能性是您的程序已经覆盖了它的一些代码。它位于与堆栈不同的内存区域,所以事情会很混乱。我怀疑这里不是这种情况。
这也可能是由过热或某些 CPU 错误引起的,但这些原因很可能在这里也可以排除。编译器中可能存在的错误也是如此。
| 归档时间: |
|
| 查看次数: |
9291 次 |
| 最近记录: |