Ann*_*inn 1 c++ algorithm debugging stl exception
这让我困扰了几个小时,因为我在数学或代码中看不到任何问题.(尽管盯着它看,并一遍又一遍地努力确定.)我希望大家可以帮助我,这是我的代码:
#define SOLVE_POSITION(x, y, z) ( z*16 + y*4 + x )
std::bitset<64> block;
block.reset();
for(int z = 0; z < 4; ++z){
for(int y = 0; y < 4; ++y){
for(int x = 0; x < 4; ++x){
if(block.at(SOLVE_POSITION(3-x, y, 3-z))){ //<-- call to at() throws 'out_of_range'
// do stuff
};
};
};
};
Run Code Online (Sandbox Code Playgroud)
当z为0时,两个最内部for循环完全运行它们(总共16次传递.)但是,一旦z变为1,那就是从std :: bitset <64> :: at()中抛出异常的时候.
的值z,y,x分别为 1,0,0在那一刻.
你能告诉我这里发生了什么导致这个例外吗?提前致谢!
宏!你必须非常小心:
你定义:
#define SOLVE_POSITION(x, y, z) ( z*16 + y*4 + x )
Run Code Online (Sandbox Code Playgroud)
所以当你这样做时:
SOLVE_POSITION(3-x, y, 3-z)
Run Code Online (Sandbox Code Playgroud)
它扩展到:
( 3-x*16 + y*4 + 3-z )
Run Code Online (Sandbox Code Playgroud)
而且由于运算符优先级,3-x*16将是不正确的!你需要这样做:
#define SOLVE_POSITION(x, y, z) ( (z)*16 + (y)*4 + (x) )
Run Code Online (Sandbox Code Playgroud)
以便它正确扩展到:
( (3-x)*16 + (y)*4 + (3-z) )
Run Code Online (Sandbox Code Playgroud)
正如所料.
| 归档时间: |
|
| 查看次数: |
666 次 |
| 最近记录: |