C++ 为什么std::bitset::at()抛出了\u范围之外的\u?
这已经困扰了我几个小时了,因为我看不到任何数学或代码上的问题。(迪斯皮特盯着它,一遍又一遍地想弄清楚。)我希望你们能帮助我,这是我的代码:C++ 为什么std::bitset::at()抛出了\u范围之外的\u?,c++,algorithm,debugging,exception,stl,C++,Algorithm,Debugging,Exception,Stl,这已经困扰了我几个小时了,因为我看不到任何数学或代码上的问题。(迪斯皮特盯着它,一遍又一遍地想弄清楚。)我希望你们能帮助我,这是我的代码: #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(i
#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
};
};
};
};
定义解算位置(x,y,z)(z*16+y*4+x)
std::位集块;
block.reset();
对于(intz=0;z<4;++z){
对于(int y=0;y<4;++y){
对于(int x=0;x<4;++x){
如果(block.at(SOLVE_POSITION(3-x,y,3-z)){/宏!您必须非常小心: 您定义:
#define SOLVE_POSITION(x, y, z) ( z*16 + y*4 + x )
所以当你这样做的时候:
SOLVE_POSITION(3-x, y, 3-z)
它扩展到:
( 3-x*16 + y*4 + 3-z )
由于运算符优先级,3-x*16
将不正确!您需要执行以下操作:
#define SOLVE_POSITION(x, y, z) ( (z)*16 + (y)*4 + (x) )
使其正确展开为:
( (3-x)*16 + (y)*4 + (3-z) )
正如预期的那样。宏!您必须非常小心: 您定义:
#define SOLVE_POSITION(x, y, z) ( z*16 + y*4 + x )
所以当你这样做的时候:
SOLVE_POSITION(3-x, y, 3-z)
它扩展到:
( 3-x*16 + y*4 + 3-z )
由于运算符优先级,3-x*16
将不正确!您需要执行以下操作:
#define SOLVE_POSITION(x, y, z) ( (z)*16 + (y)*4 + (x) )
使其正确展开为:
( (3-x)*16 + (y)*4 + (3-z) )
正如所料。宏使用文本替换,实际上是在告诉编译器
SOLVE_POSITION(3-x, y, 3-z) => SOLVE_POSITION( 3-z*16 + y*4 + 3-x )
要解决此问题,请确保用括号括住宏参数:
#define SOLVE_POSITION(x, y, z) ( (z)*16 + (y)*4 + (x) )
宏使用文本替换,实际上是在告诉编译器
SOLVE_POSITION(3-x, y, 3-z) => SOLVE_POSITION( 3-z*16 + y*4 + 3-x )
要解决此问题,请确保用括号括住宏参数:
#define SOLVE_POSITION(x, y, z) ( (z)*16 + (y)*4 + (x) )
哇,我觉得我直接走到陷阱里了!谢谢你,它终于工作了!@克拉沃尔:问你为什么你甚至会用一个宏来给所有的机会搞乱它。好,用括号,它工作得很好。如果我避免一切有可能搞乱的东西,我就不会成为C++程序员。我觉得我直接走到陷阱里了!谢谢你,它终于工作了!@ Calvural:问你为什么你甚至会用宏来给所有的机会搞乱它。好,用括号,它很好。如果我避免一切有可能搞乱的东西,我就不会是C++程序员。PThis是为什么在线有趣的。通常建议使用内联函数替换函数类宏。这就是为什么通常建议使用内联函数替换函数类宏的原因。