【问题标题】:Returning an array in c++ conversion function在 C++ 转换函数中返回一个数组
【发布时间】:2021-04-17 10:44:04
【问题描述】:

我正在尝试使用 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; 收到此错误:

严重性代码描述项目文件行抑制状态 Error (active) E0120 返回值类型与函数类型不匹配 OpenGL-Engine

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

【问题讨论】:

  • 如果你想返回一个数组,你的返回类型必须是一个数组,而不是float
  • std::array做一些研究
  • 阅读好 C++ programming book 并查看 this C++ reference。如果允许,编译您的 C++ 代码,使用 GCC 调用为 g++ -Wall -Wextra -g,然后使用 GDB 调试器。
  • 现有开源 C++ 项目的源代码中获取灵感,例如FLTKRefPerSysQtfish。你可以下载他们的 C++ 源代码并学习它以获得灵感。还可以阅读一些 C++ 标准,例如 n3337 或更好。对于RefPerSys 给我发电子邮件至basile@starynkevitch.net
  • 不能从 C++ 函数返回数组(除非它是 std::array),

标签: c++ implicit-conversion return-type function-definition incompatibletypeerror


【解决方案1】:

返回类型中的表达式

return r;

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

另一方面。函数的返回类型是float

因此编译器发出错误消息,因为没有从指针类型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&lt;float, 2&gt; 类型的对象。

#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 类型的表达式作为初始化器。

【讨论】:

  • 一切都很好,但 OpenGL API 不会喜欢 std::pair&lt;float, float&gt; 太多。
  • @n.'pronouns'm。您可以将返回的对象重新分配给数组或其他东西。没有问题。
  • 你可以,但是为什么要不必要地增加实体呢? std::array::data() 可以直接发送到 OpenGL,所以这应该是首选。
猜你喜欢
  • 2020-09-15
  • 2012-04-01
  • 2023-04-08
  • 2014-09-16
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
  • 2018-11-12
  • 1970-01-01
相关资源
最近更新 更多