[英]Why is std::bitset::at() throwing out_of_range?
現在,這困擾了我幾個小時,因為我看不到數學或代碼中的任何問題。 (盡管盯着它看,一遍又一遍地確定它。)我希望大家能幫助我,這是我的代碼:
#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( )。
的值z
, y
, x
分別是1
, 0
, 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) )
如預期的那樣。
宏使用文本替換,您可以有效地告訴編譯器
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) )
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.