2011-08-14 92 views
2

我有结构:不兼容的类型中 '浮动' 的分配给 '浮动[16]'

struct mat4 { 
    float m[16]; 
    mat4(); 
    ... 
    float *getFloat(); 
} 

float *mat4::getFloat() { 
    return m; 
} 

现在我想使米新创建的矩阵R等于m:

void mat4::rotate(vec3 v) { 
    mat4 r, rx, ry, rz; 
    ... 
    matrix calculations 
    ... 
    m = *r.getFloat(); 
} 

但是,这给了我错误“赋值'浮动'不相容的类型'浮动'[16]'” 我已经搜索谷歌并尝试不同的方式,但迄今没有成功。 请告诉我怎么做?

回答

2

r.getFloat()正在返回指向单个浮点的指针。这是取消引用给一个浮点数,然后分配给一个16浮点数组。

假设m包含mat4整个状态,您可以使用内置的赋值操作符:

*this = r; 

编译器会自动执行结构转储/ memcpy的复制所有16辆彩车。

2

使用std::copy为:

#include <algorithm> 

std::copy(r.m, r.m+16, m); 

另外,如果你可以直接使用r.m,为什么叫r.getFloat()呢?

5

getFloat()返回一个指针。 m是一个数组。如果你想复制所有的东西返回到m您将需要使用std::copystd::memcpy

std::memcpy(m, r.getFloat(), sizeof(m)); 

如果你的意思是得到getFloat()只是一个浮子,你可以这样做:

  • m[0] = *r.getFloat();
+0

当然也可以看到关于使用C++方式来解决这个问题的其他答案。使用诸如'std :: vector'或'tr1 :: array'这样的东西比自己处理它要好得多。 – Flexo

0

r.getFloat()返回指向“其”m的指针。数组不能用简单的赋值复制;您必须使用memcpy()memmove()或使用for循环遍历数组元素。

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类型的变量相互直!

相关问题