-3

獲得輸入後用一個​​恆定的值,所以在這裏,我有我的代碼的一部分,我定義宏基於用戶輸入的標識MIN_BIT設置的值:如何在功能從用戶

#define MIN_BITS(n) 1*n 
int MIN_BIT = MIN_BITS(n); 

然後我在主函數中爲用戶輸入'n'的值。

現在,我有一個功能,以便MSB是在左側到採取LSB,在陣列安排它,並打印以相反的順序排列:

void print_binary(unsigned number) 
{ 
    unsigned bits [ MIN_BIT ] ; // <-- error here 
    int count = 0 ; 
    while(number>0 || count < MIN_BIT) 
    { 
     bits [count] = number % 2; 
     number >>= 1; 
     count++; 
    } 
    for(int i = count -1; i >=0; i--) 
     cout << bits[i]; 
} 

然而,上線在標記爲1的上面的代碼,我得到一個錯誤「表達式必須有一個常量值」。變量MIN_BIT的值不能用作常量。

請爲此問題提出解決方法,或以不同方式實施此方法。

+0

C++默認情況下不會進行惰性評估。一旦創建了'MIN_BIT',當你改變'n'的值時,它的值不會改變。 – YSC

+0

yikes !!這裏有很多需要改變的地方 – AngryDuck

+2

然後,你得到的錯誤是不言自明的。如果您需要一個連續的數組,其大小取決於運行時值,請使用'std :: vector'。 – YSC

回答

1

試試這個:

#define MIN_BITS(t) (sizeof(t) * 8) 

或者,使用CHAR_BIT如果你需要支持的系統,其中一個字節是不是在8個比特大小:

#define MIN_BITS(t) (sizeof(t) * CHAR_BIT) 

然後,你可以這樣做:

void print_binary(unsigned number) 
{ 
    const int num_bits = MIN_BITS(number); 

    unsigned bits [ num_bits ]; 
    int count; 

    for(count = 0; (number != 0) && (count < num_bits); ++count) 
    { 
     bits[count] = number & 1; 
     number >>= 1; 
    } 

    for(int i = count-1; i >= 0; --i) 
     cout << bits[i]; 
} 

Live demo


您不能使用在運行時確定的值(即已知爲可變長度數組,這是非標準的,只有少數編譯器將其實現爲額外功能)定義靜態固定長度數組。如果你需要,可以使用std::vector代替:

#include <vector> 

void print_binary(unsigned number) 
{ 
    std::vector<unsigned> bits; 
    bits.reserve(n); 

    for(int i = 0; (number != 0) && (i < n); ++i) 
    { 
     bits.push_back(number & 1); 
     number >>= 1; 
    } 

    for(int i = bits.size()-1; i >= 0; --i) 
     cout << bits[i]; 
} 

否則,只定義數組是作爲輸入變量可以實際容納的最大位爲大,然後使用用戶輸入的值來限制多少價值您可以在數組中存儲:

#define MAX_BITS(t) (sizeof(t) * CHAR_BIT) 

void print_binary(unsigned number) 
{ 
    const int max_bits = MAX_BITS(number); 

    unsigned bits [ max_bits ]; 
    int count; 

    for(count = 0; (number != 0) && (count < n) && (count < max_bits); ++count) 
    { 
     bits[count] = number & 1; 
     number >>= 1; 
    } 

    for(int i = count-1; i >= 0; --i) 
     cout << bits[i]; 
} 
+0

如果我需要將MIN_BITS(t)設置爲2,3,4,5位等等? –

+0

@chrisstone你爲什麼需要這樣做?你有一個給定類型的輸入值,你應該輸出儘可能多的位,因爲它具有物理上的位(或者至少需要用來表示數值的位)。如果您想要較少的位,請使用較小的數據類型。讓用戶輸入位數是沒有意義的,尤其是因爲您的原始代碼沒有進行適當的邊界檢查,並且如果數值大於請求的位數,可能會使數組溢出(因爲您使用'||'而不是''while'循環中的&&')。你讓用戶輸入位數的用例是什麼? –

+0

在MIN_BIT(t)的幫助下,我實際上要計算定義布爾函數的變量數,例如,如果布爾表達式由三個變量a,b和c定義,用戶將輸入'3'作爲輸入。即使我會使用char數據類型作爲輸入變量,我會得到8 * 8 = 16位,而我需要MIN_BITS爲'3' –