在Python中使用ctypes调用C函数

0 投票
1 回答
2390 浏览
提问于 2025-04-17 12:45

我正在尝试从Python调用C语言的函数,我在C语言中写了以下代码。

struct _returndata
{
    double* data;
    int row;
    int col;
};

int mlfAddmatrixW(struct _returndata* retArr)
{
    double data[] = {1,2,3,4,5,6,7,8,9} 
    retArr->row = 3;
    retArr->col = 3;        
    memcpy(retArr->data, data, 9*sizeof(double));            
    return  1;
}

这是我在Python中的代码:

class RETARRAY(Structure):
    _fields_= [("data", c_double*9),
              ("row", c_int),
            ("col", c_int)]

if __name__ == '__main__':      

    dll = CDLL("/home/robu/Documents/tmo_compile/libmatrix/distrib/libmatrixwrapper.so")    

    #Initializing the matrix 
    retArr = pointer(RETARRAY())

    for i in retArr.contents.data:
        print i;

    dll.mlfAddmatrixW(pointer(retArr))
    for i in retArr.contents.data:
        print i;

    print retArr.contents.row
    print retArr.contents.col

数据的内容已经改变了,但列和行仍然是0。我该怎么解决这个问题呢?在Python中可以创建动态数组吗?因为在这个例子中,我创建了一个包含9个元素的数组("data", c_double*9)。我知道在调用mlfAddmatrixW函数后,数组的大小会变成col*row

1 个回答

2

在C语言和Python中,你会发现它们的结构体(struct)是不同的:C语言的结构体里有一个指向双精度浮点数的指针,而Python的结构体则是一个双精度浮点数的数组。你可以试试下面的代码:

NineDoubles = c_double * 9

class RETARRAY(Structure):
    _fields_= [("data", POINTER(c_double)),
              ("row", c_int),
              ("col", c_int)]

#Initializing the matrix 
data = NineDoubles()
retArr = RETARRAY()
retArr.data = data

dll.mlfAddmatrixW(pointer(retArr))

撰写回答