C:在函数内声明数组时,表达式必须有一个常量值

新手上路,请多包涵

我查看了所有其他类似主题的帖子,没有任何帮助,所以请不要标记为重复。

我在 main() a const int SIZE = 20; 中定义。然后,我将其作为参数传递给我的函数 Mode:

 int* Mode(int* numbers, int & mode, const int SIZE)
 {
     int occurences[SIZE];

     // Calcualte mode
 }

但是,我收到错误 expression must have a constant value

我的函数调用(在 main 中)如下所示:

 int* occurencesPtr = Mode(numbersPtr, mode, SIZE);

SIZE 在文字的开头定义 20

我知道该错误是因为函数的版本 SIZE 仅在调用函数时才获取其值(?),但我不知道如何解决这个问题。

我什至尝试将 const int * const SIZEPtr = &SIZE 传递给函数,但这也不起作用。帮助?

编辑:我 不想 使用可变大小!请注意,我到处都制作了 SIZE a const !我只想使用相同的 SIZE 常量来声明我的数组。

编辑:动态数组不是我需要的。我只想要一个普通的命名数组,用传递给函数的 常量 大小值定义。

原文由 vasilescur 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 4.1k
2 个回答

这里对 const 的含义有一个误解,可能是因为这有点令人困惑:

 const int SIZE = 20;
int array[SIZE];

但这不是:

 void foo(const int SIZE) {
    int array[SIZE];
    // ...
}

const int SIZE = 20;
foo(SIZE);

问题是数组声明中的数组大小必须是核心常量表达式。简而言之,这意味着在编译时可评估为常量的表达式。在第一种情况下确实如此(您可以看到 SIZE 是积分常数 20 )但在第二种情况下 并非 如此。在那里, SIZE 函数参数只是 const - 从某种意义上说,它是不可修改的 - 而不是核心常量表达式。您可以看到不同之处在于我可以调用 foo() 一些在运行时之前显然不可知的东西:

 int x;
if (std::cin >> x) {
    foo(x);
}

为了将参数传递给 foo 并将该参数用作数组边界,将其设为 const 是不够的 - 实际的整数值必须编码为类型(除非您将 foo() 称为 constexpr 我假设这里不是这种情况)。在这种情况下,您必须执行以下操作:

 template <int SIZE>
void foo() { ... }

const int SIZE = 20;
foo<SIZE>();

或者:

 template <int SIZE>
void foo(std::integral_constant<int, SIZE > ) { ... }

const int SIZE = 20;
foo(std::integral_constant<int, SIZE>{} );

或者干脆让 SIZE 成为全局常量,或者以其他方式访问 foo() 与其参数无关。


或者,总是有一个简单的选项:使用 std::vector

 void foo(const int SIZE) {
    std::vector<int> v(SIZE);
    ...
}

原文由 Barry 发布,翻译遵循 CC BY-SA 3.0 许可协议

我知道该错误是因为函数的 SIZE 版本仅在调用函数时才获取其值(?),但我不知道如何解决这个问题。

选项1

不要在 SIZE main 而是添加一个 constexpr 函数。使用 constexpr 函数而不是传递大小。

 constexpr int getSize()
{
   return 20;
}

int* Mode(int* numbers, int & mode)
{
   int occurences[getSize()];

   // ...

}

选项 2

使用 std::vector 而不是数组。

 int* Mode(int* numbers, int & mode, int size)
{
   std::vector<int> occurences[size];

   // ...

}

选项 3

使用函数模板。

 template <size_t SIZE>
int* Mode(int* numbers, int & mode, int size)
{
   int occurences[SIZE];

   // ...

}

选项 4

使用函数模板和 std::array

 template <size_t SIZE>
int* Mode(int* numbers, int & mode, int size)
{
   std::array<int, SIZE> occurences;

   // ...

}

原文由 R Sahu 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题