通过C ++中的函数传递未调整大小的数组

时间:2018-11-15 02:35:05

标签: c++ function dynamic-arrays

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

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

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

2 个答案:

答案 0 :(得分:2)

float addLayer(float layers[]);

等同于

float addLayer(float* layers);

i。 e。您所拥有的只是指针。数组衰减到指针后,所有长度信息都会丢失。

要保留长度信息,可以在单独的参数中传递它,或者,可以将引用传递给数组:

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

此外,还有语法错误:

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

图层已经已经是一个数组(但是如果传递给函数的指针版本,则会衰减到指针),而您在上一行中实际执行的操作是将index运算符应用于数组-但是没有参数(请注意,使用参数,您将获得浮点值,而不再是指针。)

最后:std::array(固定大小)和std::vector(可变大小)都是原始数组的更好替代方案,请尽可能使用其中之一。

答案 1 :(得分:1)

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

为了在C ++中实现此功能,您需要改用std::arraystd::vector