在 C++ 中通过函数传递未调整大小的数组
Passing Unsized Array through function in C++
我正在尝试初始化一个动态数组并通过一个函数传递它,但每次这样做时我总是遇到错误。
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 数组作为参数传递给函数——C 不允许,因此 C++ 也不允许。如果您将一个函数声明为将 C 数组作为参数,编译器会默默地将其更改为一个指针,因此您实际上是在传递一个指针。因此,在该指针参数上调用 std::begin 和 std::end 将不起作用。
为了在 C++ 中实现此功能,您需要使用 std::array
或 std::vector
。
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 是已经是一个数组(但如果传递给函数的指针版本则衰减为指针),并且您在上一行中实际做的是将索引运算符应用于数组– 但是没有参数(请注意,如果有参数,您将得到一个浮点值,而不是指针)。
最后:std::array
(fixed size) and std::vector
(可变大小)都是原始数组的更好替代品,尽可能使用其中之一。
我正在尝试初始化一个动态数组并通过一个函数传递它,但每次这样做时我总是遇到错误。
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 数组作为参数传递给函数——C 不允许,因此 C++ 也不允许。如果您将一个函数声明为将 C 数组作为参数,编译器会默默地将其更改为一个指针,因此您实际上是在传递一个指针。因此,在该指针参数上调用 std::begin 和 std::end 将不起作用。
为了在 C++ 中实现此功能,您需要使用 std::array
或 std::vector
。
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 是已经是一个数组(但如果传递给函数的指针版本则衰减为指针),并且您在上一行中实际做的是将索引运算符应用于数组– 但是没有参数(请注意,如果有参数,您将得到一个浮点值,而不是指针)。
最后:std::array
(fixed size) and std::vector
(可变大小)都是原始数组的更好替代品,尽可能使用其中之一。