我正在尝试用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返回值类型与OpenGL引擎功能类型不匹配
我认为这与数组在c++中的工作方式有关。这里的问题是什么?提前谢谢。
返回类型中的表达式
return r;
由于数组指示符隐式转换为指向其第一个元素的指针,因此具有类型float *
。
另一方面。函数的返回类型为CCD_ 3。
因此编译器会发出错误消息,因为没有从指针类型float *
到类型float
的隐式转换。
但是,如果您愿意,将函数的返回类型从float
更改为float *
,则会出现另一个问题,即返回指向退出函数后将不活动的本地数组的指针
由于数组只包含两个元素,所以可以返回类型为std::pair<float, float>
的对象,而不是尝试返回数组。
例如
#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) };
}
另一种选择是返回类型为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类型表达式作为初始值设定项。