Как использовать постоянное значение в функции после получения ввода от пользователя

Так что здесь у меня есть часть моего кода, где я определяю макросы для установки идентификатора 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 нельзя использовать как константу.

Пожалуйста, предложите обходное решение проблемы или способ реализации этого по-другому.

-3

Решение

Попробуйте это вместо этого:

#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];
}
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]