在 C++ 转换函数中返回一个数组

Returning an array in c++ conversion function

我正在尝试使用 OpenGL 学习 C++。 OpenGL 在 x 轴和 y 轴上从 -1 到 1 的坐标系上进行渲染。我正在尝试制作一个将像素转换为 openGL 坐标的函数。我有这个代码:

float pixelsToCoordinates(int pixels[2]) {
    float r[2] = { (pixels[0] - windowWidth / 2) / (windowWidth / 2) * windowWidth / windowHeight, (pixels[1] - windowHeight / 2) / (windowHeight / 2) };
    return r;
}

我在 cpp return r; 上收到此错误:

严重性代码说明项目文件行抑制状态 错误(主动)E0120 return 值类型与函数类型不匹配 OpenGL-Engine

我认为这与数组在 C++ 中的工作方式有关。这是什么问题?提前致谢。

return 类型中的第一个表达式

return r;

由于数组指示符隐式转换为指向其第一个元素的指针,因此具有类型 float *

另一方面。 return 函数的类型是 float.

因此编译器发出错误消息,因为没有从指针类型 float * 到类型 float 的隐式转换。

但是如果你愿意,将函数的 return 类型从 float 更改为 float * 会有另一个问题 returning 一个指向本地的指针退出函数后不会存活的数组

由于您的数组仅包含两个元素,因此您可以 return 类型为 std::pair<float, float> 的对象,而不是尝试 return 数组。

例如

#include <utility>

//...

std::pair<float, float> pixelsToCoordinates( const int pixels[] ) {
    return { (pixels[0] - windowWidth / 2.0f) / (windowWidth / 2.0f) * windowWidth / windowHeight, (pixels[1] - windowHeight / 2.0f) / (windowHeight / 2.0f) };
}

另一种选择是 return 类型为 std::array<float, 2> 的对象。

#include <array>

//...

std::array<float, 2> pixelsToCoordinates( const int pixels[] ) {
    return { (pixels[0] - windowWidth / 2.0f) / (windowWidth / 2.0f) * windowWidth / windowHeight, (pixels[1] - windowHeight / 2.0f) / (windowHeight / 2.0f) };
}

另一种选择是在函数的调用者中定义目标数组,并将其作为参数传递给函数。例如

float ( & pixelsToCoordinates( const int pixels[], float ( &a )[2] ) )[2];

注意,如果你想获取 float 类型的值,那么通常你应该使用 float 类型的表达式作为初始值设定项。