C++ 错误:无法转换';浮动*';至';初始化中的qreal*{aka double*}
我试图编译旧的Qt项目,但遇到以下错误: 错误:无法将中的“float*”转换为“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 <
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);
}