2013-08-23 175 views
1

在我的C代码,我有:ctypes的 - 通过一个结构的指针另一个结构

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结构。

回答

2

如果您不需要分配或使用MoreData结构,那么就ctypes而言,md只是一个通用指针。使用void * - 即c_void_p

1

您需要定义一个class MoreData(Structure)包装其他结构。然后通过,作为("md", POINTER(MoreData))。如果你真的不想从Python访问md那么你可以在_fields_(因为它是最后一个)才能指定它。所以,如果你真的不想从Python访问md那么你可以不指定它在_fields_(因为它是最后一个)。然后ctypes会相信你只有前两个成员的结构。

Ctypes适合一次性访问C结构,但如果你经常用Python绑定C代码,那么我真的会推荐你去看看Cython。

编辑:正如eryksun指出的那样(微弱双关),我忘了指针。

+1

我读的问题是'BasicData'结构由ctypes分配并传递给一个函数。在那种情况下,它至少需要一个'c_void_p'。如果确实定义了'MoreData'结构,那么该字段将是'(“md”,POINTER(MoreData))'。 – eryksun

+0

同意,取决于是否有任何C代码访问'md' – vbraun

相关问题