簡體   English   中英

為什么std :: bitset :: at()拋出out_of_range?

[英]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( )。

的值zyx分別是100的那一刻。

您能告訴我這里發生了什么導致此異常的情況? 提前致謝!

宏! 您必須對此非常小心:

您定義:

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM