Так что здесь у меня есть часть моего кода, где я определяю макросы для установки идентификатора 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 нельзя использовать как константу.
Пожалуйста, предложите обходное решение проблемы или способ реализации этого по-другому.
Попробуйте это вместо этого:
#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];
}
Вы не можете определить статический массив фиксированной длины, используя значение, определенное во время выполнения (это называется массивом переменной длины, который является нестандартным, и только несколько компиляторов реализуют его как дополнительную функцию). Если вам это нужно, используйте 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];
}
Других решений пока нет …