所以这里我有一部分代码,我在其中定义宏以将标识符MIN_BIT
设置为基于用户输入的值:
#define MIN_BITS(n) 1*n
int MIN_BIT = MIN_BITS(n);
然后我在主函数中接受用户输入'n'的值。
现在,我有一个函数来获取LSB,将它排列在一个数组中,并以相反的顺序打印数组,因此MSB在左边:
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 :(得分:1)
请改为尝试:
#define MIN_BITS(t) (sizeof(t) * 8)
或者,如果您需要支持字节大小不是8位的系统,请使用CHAR_BIT
:
#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];
}
您不能使用在运行时确定的值来定义静态固定长度数组(称为可变长度数组,这是非标准的,只有少数编译器将其实现为额外功能)。如果您需要,请改为使用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];
}