gpt4 book ai didi

c++ - 为什么 std::bitset::at() 抛出 out_of_range?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:13:11 32 4
gpt4 key购买 nike

这已经困扰了我几个小时,因为我看不出数学或代码中有任何问题。 (尽管盯着它并一遍又一遍地确定它。)我希望你们能帮助我,这是我的代码:

#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
};
};
};
};

z 为 0 时,最内层的两个 for 循环将完全运行(总共 16 次)。但是,一旦 z 变为 1,即异常从 std::bitset<64>::at() 中抛出。

zyx的值分别为10, 0 那一刻。

你能告诉我这里发生了什么导致这个异常吗?提前致谢!

最佳答案

宏!你必须非常小心:

您定义:

#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) )

正如预期的那样。

关于c++ - 为什么 std::bitset::at() 抛出 out_of_range?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7537022/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com