Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/279.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函数到Python的矩阵_Python_Function_Matrix_Return_Ctypes - Fatal编程技术网

从C函数到Python的矩阵

从C函数到Python的矩阵,python,function,matrix,return,ctypes,Python,Function,Matrix,Return,Ctypes,我正在使用python和ctypes。我有一个C函数将四元数(类似于虚数)转换成矩阵。我知道,在类似于函数的参数中发送结果变量是错误的,所以如何将矩阵返回到数组c_float*16中的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 * (

我正在使用python和ctypes。我有一个C函数将四元数(类似于虚数)转换成矩阵。我知道,在类似于函数的参数中发送结果变量是错误的,所以如何将矩阵返回到数组c_float*16中的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;
}

您正在返回指向局部变量的指针。这将导致内存损坏。我建议创建一个
struct
enapsulating您的矩阵并返回:

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

matrix QuaternionToMatrix(Quaternion q) {
    ...
}
因为这将导致复制一些内存量(约512字节),所以最好将矩阵作为输出参数传递:

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

如果我理解正确,您只需返回一个元组,而不是python中的数组。(就像C中的一个列表)你们能写一个例子吗,我如何在C中创建列表以返回python代码。你们返回的是一个指向局部变量的指针。这将导致内存损坏。