我有结构:
struct mat4 {
float m[16];
mat4();
...
float *getFloat();
}
float *mat4::getFloat() {
return m;
}
现在我想从新创建的矩阵r中使m等于m:
void mat4::rotate(vec3 v) {
mat4 r, rx, ry, rz;
...
matrix calculations
...
m = *r.getFloat();
}
但是这给了我错误“将'float'赋值给'float [16]'的不兼容类型” 我搜索谷歌并尝试了不同的方法,但到目前为止没有成功。 请告诉我怎么能这样做?
答案 0 :(得分:5)
getFloat()
返回一个指针。 m
是一个数组。如果您要将所有返回的内容复制到m
,则需要使用std::copy
或std::memcpy
:
std::memcpy(m, r.getFloat(), sizeof(m));
如果您打算从getFloat()
获得一个浮点数,则可以执行以下操作:
m[0] = *r.getFloat();
答案 1 :(得分:2)
将std::copy
用作:
#include <algorithm>
std::copy(r.m, r.m+16, m);
此外,如果您可以直接使用r.m
,为什么还要调用r.getFloat()
?
答案 2 :(得分:2)
不要使用裸C数组。这是C ++,我们可以做得更好:
#include <tr1/array> // or <array> if you're in MSVC or GCC
typedef std::tr1::array<float, 16> myfloats;
int main()
{
myfloats a, b;
a[0] = /* ... fill the array */
b = a; // done
}
您也可以将数组放入矩阵结构中:
struct mat4
{
typedef std::tr1::array<float, 16> myfloats;
myfloats & data() { return m_data; }
mat4(); /* ... etc. ... */
private:
myfloats m_data;
};
您应该能够直接为彼此分配mat4
类型的变量!
答案 3 :(得分:2)
r.getFloat()
正在返回指向单个float的指针。将其取消引用以提供单个浮点数,然后将其分配给包含16个浮点数的数组。
假设m
包含整个mat4
状态,您可以使用内置赋值运算符:
*this = r;
编译器将自动实现struct dump / memcpy来复制所有16个浮点数。
答案 4 :(得分:0)
r.getFloat()返回指向“its”m
的指针。无法使用简单赋值复制数组;您必须使用memcpy()
或memmove()
或在数组元素上使用for
循环。