Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误:无法转换';浮动*';至';初始化中的qreal*{aka double*}_C++_Qt_Opengl_Mingw - Fatal编程技术网

C++ 错误:无法转换';浮动*';至';初始化中的qreal*{aka double*}

C++ 错误:无法转换';浮动*';至';初始化中的qreal*{aka double*},c++,qt,opengl,mingw,C++,Qt,Opengl,Mingw,我试图编译旧的Qt项目,但遇到以下错误: 错误:无法将中的“float*”转换为“qreal*{aka double*}” 初始化 下面是代码片段: void Camera::loadProjectionMatrix() { glMatrixMode(GL_PROJECTION); glLoadIdentity(); qreal *dataMat = projectionMatrix_.data(); GLfloat matriceArray[16]; for (int i= 0; i <

我试图编译旧的Qt项目,但遇到以下错误:

错误:无法将中的“float*”转换为“qreal*{aka double*}” 初始化

下面是代码片段:

void Camera::loadProjectionMatrix()
{
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
qreal *dataMat = projectionMatrix_.data();
GLfloat matriceArray[16];
for (int i= 0; i < 16; ++i)
    matriceArray[i] = dataMat[i];
glMultMatrixf(matriceArray);
}
void Camera::loadProjectionMatrix()
{
glMatrixMode(GL_投影);
glLoadIdentity();
qreal*dataMat=projectionMatrix_ux.data();
GLfloat矩阵阵列[16];
对于(int i=0;i<16;++i)
矩阵阵列[i]=dataMat[i];
glMultMatrixf(矩阵阵列);
}

克服此错误的方法有哪些?

显然,
projectionMatrix.data()
返回一个
float*
,您不能将
float*
分配给
double*
(在本例中,
qreal*

使用


相反。后者有时的优点是,如果函数的返回类型因某种原因发生更改,它可能仍然是正确的代码,尽管这在成熟的库中是不可能的。此外,您不能在意外情况下将类型弄错。

显然,
projectionMatrix.data()
返回一个
float*
,并且您不能将
float*
分配给
double*
(在本例中是
qreal*

使用


相反。后者有时的优点是,如果函数的返回类型因某种原因发生更改,它可能仍然是正确的代码,尽管这在成熟的库中是不可能的。此外,您不能在发生事故时将类型弄错。

投影矩阵将根据文档返回
float*

返回指向此矩阵的原始数据的指针

最好的做法是消除代码库中的
qreal
用法,不管这种情况如何。当贡献者经历Qt5重构时,qreal这个古老的概念被尽可能地抛弃了,并且肯定不应该在API处理浮点的新代码中使用太多

建议在这些情况下使用float。这真的有点历史性。当时,将qreal定义为在可用的情况下加倍,但在不可用的情况下浮动是有意义的,例如ARM平台。请参阅旧文档:

Typedef适用于所有平台上的double,使用ARM体系结构CPU的平台除外。在基于ARM的平台上,出于性能原因,qreal是浮点的typedef

在Qt 5中,文档略有不同,尽管主要概念似乎保持不变:

除非Qt配置了-qreal float选项,否则双精度的Typedef

我将通过以下方式修复您的代码:

void Camera::loadProjectionMatrix()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float *dataMat = projectionMatrix_.data();
    GLfloat matriceArray[16];
    for (int i= 0; i < 16; ++i)
        matriceArray[i] = dataMat[i];
    glMultMatrixf(matriceArray);
}
void Camera::loadProjectionMatrix()
{
glMatrixMode(GL_投影);
glLoadIdentity();
float*dataMat=projectionMatrix_ux.data();
GLfloat矩阵阵列[16];
对于(int i=0;i<16;++i)
矩阵阵列[i]=dataMat[i];
glMultMatrixf(矩阵阵列);
}
严格地说,您还可以使用另一种方法来解决此问题,即使用此方法而不是
data()

返回对此矩阵中位置(行、列)处元素的引用,以便可以将该元素指定给

在这种情况下,您甚至可以消除
dataMat
变量,并在迭代中将项目直接分配给
matriceArray


更进一步,您应该考虑使用Qt库来完成这个共同的任务,例如在<代码> QtGui < /COD>或<代码> QT3D 中的OpenGL类。如果您执行自定义操作,则处理低级opengl API调用会更有意义。

投影矩阵将根据文档返回
float*

返回指向此矩阵的原始数据的指针

最好的做法是消除代码库中的
qreal
用法,不管这种情况如何。当贡献者经历Qt5重构时,qreal这个古老的概念被尽可能地抛弃了,并且肯定不应该在API处理浮点的新代码中使用太多

建议在这些情况下使用float。这真的有点历史性。当时,将qreal定义为在可用的情况下加倍,但在不可用的情况下浮动是有意义的,例如ARM平台。请参阅旧文档:

Typedef适用于所有平台上的double,使用ARM体系结构CPU的平台除外。在基于ARM的平台上,出于性能原因,qreal是浮点的typedef

在Qt 5中,文档略有不同,尽管主要概念似乎保持不变:

除非Qt配置了-qreal float选项,否则双精度的Typedef

我将通过以下方式修复您的代码:

void Camera::loadProjectionMatrix()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float *dataMat = projectionMatrix_.data();
    GLfloat matriceArray[16];
    for (int i= 0; i < 16; ++i)
        matriceArray[i] = dataMat[i];
    glMultMatrixf(matriceArray);
}
void Camera::loadProjectionMatrix()
{
glMatrixMode(GL_投影);
glLoadIdentity();
float*dataMat=projectionMatrix_ux.data();
GLfloat矩阵阵列[16];
对于(int i=0;i<16;++i)
矩阵阵列[i]=dataMat[i];
glMultMatrixf(矩阵阵列);
}
严格地说,您还可以使用另一种方法来解决此问题,即使用此方法而不是
data()

返回对此矩阵中位置(行、列)处元素的引用,以便可以将该元素指定给

在这种情况下,您甚至可以消除
dataMat
变量,并在迭代中将项目直接分配给
matriceArray


更进一步,您应该考虑使用Qt库来完成这个共同的任务,例如在<代码> QtGui < /COD>或<代码> QT3D 中的OpenGL类。如果您做一些自定义的事情,那么处理低级opengl API调用会更有意义。

projectionMatrix_uux.data()的数据类型是什么?如果它是浮动的,那么只有我们
void Camera::loadProjectionMatrix()
{
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    float *dataMat = projectionMatrix_.data();
    GLfloat matriceArray[16];
    for (int i= 0; i < 16; ++i)
        matriceArray[i] = dataMat[i];
    glMultMatrixf(matriceArray);
}