Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么std::bitset::at()抛出了\u范围之外的\u?_C++_Algorithm_Debugging_Exception_Stl - Fatal编程技术网

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是为什么在线有趣的。通常建议使用内联函数替换函数类宏。这就是为什么通常建议使用内联函数替换函数类宏的原因。