【问题标题】:Passing Unsized Array through function in C++ [duplicate]通过 C++ 中的函数传递 Unsized Array [重复]
【发布时间】:2019-04-18 02:13:59
【问题描述】:

我正在尝试初始化一个动态数组并将其传递给一个函数,但每次我这样做时都会出错。

float addLayer(float layers[]){
    float addColor = 0;
    if (std::find(std::begin(layers), std::end(layers), addColor)){
        // run code
        addColor = ...;
    }
    return addColor
}

float layers[] = {0};
newColor = addLayer(layers[]); //line 2

我收到错误:

Expected identifier or '(' on line 2

任何帮助将不胜感激,谢谢

【问题讨论】:

  • C++ 没有动态数组。请改用向量。此外,您不需要为作为函数参数传递的数组包含括号。
  • std::arraystd::vector 在某些情况下不起作用。要处理std::array,您必须有一个模板函数。带有重复代码的模板会膨胀二进制文件。即如果您传递 2 和 3 的数组,您将在二进制文件中有两个实例化。如果你使用vector,你必须通过const&传递它。指向指针的指针.. 不.. std::span (C++20) 会有所帮助。从我的角度来看,使用 unsized 数组作为参数参数是完全有意义的。与指针的不同之处在于,您以这种方式告诉调用者您不期望 NULL 指针(但是仍然可以传递 NULL)。

标签: c++ function dynamic-arrays


【解决方案1】:
float addLayer(float layers[]);

等价于

float addLayer(float* layers);

我。 e.你所拥有的只是指针。一旦数组衰减到指针,所有长度信息都会丢失。

要保留长度信息,可以在单独的参数中传递,也可以传递对数组的引用:

template <size_t N>
float addLayer(float(&layers)[N]); // pass reference to array of length N

另外,还有语法错误:

newColor = addLayer(layers[]);
//                        ^^

Layers is 已经是一个数组(但如果传递给函数的指针版本,则衰减为指针),并且您在上面的行中实际所做的是将索引运算符应用于数组 - 但是没有参数 (请注意,使用参数,您将得到一个浮点值,而不是指针)。

最后:std::array(fixed size) 和 std::vector(variable size) 都是原始数组的更好替代品,尽可能使用其中之一。

【讨论】:

    【解决方案2】:

    问题是您不能将 C 数组作为参数传递给函数——C 不允许这样做,因此 C++ 也不允许。如果您将函数声明为将 C 数组作为参数,编译器会默默地将其更改为指针,因此您实际上是在传递指针。因此,对该指针参数调用 std::begin 和 std::end 将不起作用。

    为了使这项工作在 C++ 中工作,您需要改用 std::arraystd::vector

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 1970-01-01
      • 2021-04-24
      • 2012-10-07
      • 1970-01-01
      • 2012-12-08
      • 2017-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多