【问题标题】:How to use a constant value in a function after getting input from user获取用户输入后如何在函数中使用常量值
【发布时间】:2018-02-23 16:36:54
【问题描述】:

所以在这里我有一部分代码在其中定义了宏来将标识符 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 的值不能用作常量。

请提出解决此问题的方法,或以不同方式实施此问题的方法。

【问题讨论】:

  • C++ 默认不进行惰性求值。一旦MIN_BIT被创建,当你改变n的值时它的值不会改变。
  • 哎呀!!这里有很多需要改变的地方
  • 那么,您得到的错误是不言自明的。如果您需要一个大小取决于运行时值的连续数组,请使用std::vector
  • 请注意常量和编译时常量之间的区别。编译时常量是一个常量,其值在编译时已知,根据定义,在可以接收任何用户输入之前。在这种情况下,MIN_BIT 需要是编译时常量。在大多数情况下,如果您需要一个仅在运行时知道其大小的容器,请使用std::vector&lt;T&gt;
  • @AngryDuck 哎呀,很抱歉代码没有被正确淹没..:(

标签: c++ visual-c++ functional-programming visual-studio-macros


【解决方案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];
}

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

【讨论】:

  • 如果我需要将 MIN_BITS(t) 设置为 2、3、4、5 位等怎么办?
  • @chrisstone 为什么需要这样做?您有一个给定类型的输入值,您应该输出与它物理上一样多的位(或者,至少与表示数值所需的位一样多)。如果您想要更少的位,请使用更小的数据类型。让用户输入位数是没有意义的,特别是因为您的原始代码没有进行正确的边界检查,并且如果数值大于请求的位数可能会溢出数组(因为您使用 || 代替&amp;&amp; 在你的while 循环中)。您让用户输入位数的用例是什么?
  • 在 MIN_BIT(t) 的帮助下,我实际上要计算定义布尔函数的变量数,例如,如果布尔表达式由三个变量 a、b 和 c 定义,用户会输入“3”作为输入。即使我将 char 数据类型用于输入变量,我也会得到 8*8=16 位,而我需要 MIN_BITS 为 '3'
  • 这在您展示的代码的上下文中绝对没有意义。您不能使用在运行时确定的值定义静态固定长度数组(称为可变长度数组,它是非标准的,只有少数编译器将其作为额外的实现)。如果需要,请改用std::vector。否则,将数组定义为与输入变量物理上可以容纳的最大位数一样大,然后使用用户输入的值来限制您可以在数组中存储多少个值。
  • 非常感谢 Remy,将 MAX_BIT 设置为固定值并从用户那里读取 MIN_BIT 值真的很有帮助。虽然我真的很抱歉我是个菜鸟,一开始没有把事情说清楚。我现在会谷歌看看 std::vector 的实现。只是附带说明一下,我为此目的使用 VS2017 作为我的编译器..:)
猜你喜欢
  • 1970-01-01
  • 2013-04-30
  • 1970-01-01
  • 2016-11-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
相关资源
最近更新 更多