在我的C代码中,我有:
typedef struct{
int info1;
int info2;
MoreData* md;
} BasicData;
typedef struct{
int extinfo[100];
char stuff[100];
} MoreData;
现在我有一个C库函数,它将BasicData作为参数,我想从Python调用它。 为此,我构建了一个ctypes类:
class BasicData(Structure):
_fields_ = [("info1", c_int),
("info2", c_int),
("md", ??????)]
我的问题是我要填写什么?空间能够将此结构传递给C函数(或者我需要一些完全不同的东西?)。 MoreData只是在计算过程中使用,我不需要在我的Python代码中读取它,因此为它分配内存将从C库级别处理。我只需要传递一个具有正确指针类型的BasicData结构。
答案 0 :(得分:2)
如果您不需要分配或使用MoreData
结构,那么md
就像ctypes而言只是一个通用指针。使用void *
- 即c_void_p
。
答案 1 :(得分:1)
您需要定义包含其他结构的class MoreData(Structure)
。然后将其传递为("md", POINTER(MoreData))
。
C保证struct字段按顺序分配,所以如果你真的不想从Python访问md
那么你就不能在_fields_
中指定它(因为它是最后的) 。然后ctypes会相信你有一个只有前两个成员的结构。
Ctypes可以一次性访问C结构,但是如果你经常用C语言将C代码绑在一起,那么我真的建议你查看Cython。
编辑:正如eryksun指出的那样(微弱的双关语),我忘记了指针。