gpt4 book ai didi

python - 使用 ctypes 在 python 中调用 c 函数

转载 作者:行者123 更新时间:2023-11-30 14:26:22 26 4
gpt4 key购买 nike

我正在尝试从 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

最佳答案

C 和 Python 中有不同的结构:一个有一个指向 double 的指针,另一个是 double 数组。尝试这样的事情:

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))

关于python - 使用 ctypes 在 python 中调用 c 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9227370/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com