2012-08-02 96 views
2

我正在使用python和ctypes。我有一個C函數將一個四元數(類似於一個虛數)轉換爲一個矩陣。我知道,在函數中發送結果變量就像參數是不好的語氣,所以我怎樣才能將矩陣返回到類型數組c_float * 16中的python代碼。矩陣從C函數到Python

float* QuaternionToMatrix(Quaternion q) 
{ 
    float matrix[16]; 

    matrix[ 0] = 1.0f - 2.0f * (q.y * q.y + q.z * q.z); 
    matrix[ 1] = 2.0f * (q.x * q.y + q.z * q.w); 
    matrix[ 2] = 2.0f * (q.x * q.z - q.y * q.w); 
    matrix[ 3] = 0.0f; 

    matrix[ 4] = 2.0f * (q.x * q.y - q.z * q.w); 
    matrix[ 5] = 1.0f - 2.0f * (q.x * q.x + q.z * q.z); 
    matrix[ 6] = 2.0f * (q.z * q.y + q.x * q.w); 
    matrix[ 7] = 0.0f; 

    matrix[ 8] = 2.0f * (q.x * q.z + q.y * q.w); 
    matrix[ 9] = 2.0f * (q.y * q.z - q.x * q.w); 
    matrix[10] = 1.0f - 2.0f * (q.x * q.x + q.y * q.y); 
    matrix[11] = 0.0f; 

    matrix[12] = 0; 
    matrix[13] = 0; 
    matrix[14] = 0; 
    matrix[15] = 1.0f; 

    float* a = matrix; 

    return a; 
} 
+0

如果我理解正確,而不是Python中的數組,您可以簡單地返回一個元組。 (它就像C中的一個列表) – 2012-08-02 15:42:14

+0

你能寫一個例子,我如何在C中創建列表以將它返回給Python代碼。 – shestakoffvs 2012-08-02 15:47:08

+0

您正在返回一個指向局部變量的指針。這會導致內存損壞。 – ecatmur 2012-08-02 16:11:35

回答

3

您正在返回一個指向局部變量的指針。這會導致內存損壞。我建議建立一個struct enapsulating你的矩陣並返回一個:(ç512個字節)

typedef struct matrix { 
    float data[16]; 
} matrix; 

matrix QuaternionToMatrix(Quaternion q) { 
    ... 
} 

因爲這會導致複製一定數量的內存,你可能會更好矩陣傳遞作爲out - 參數:

void QuaternionToMatrix(Quaternion q, matrix *matrix) { 
    ... 
} 
+0

Big thx)))第一種方式是我)))))) – shestakoffvs 2012-08-02 16:54:03