2

在我的 C 代码中,我有:

typedef struct{
    int info1;
    int info2;
    MoreData* md;
} BasicData;

typedef struct{
    int extinfo[100];
    char stuff[100];
} MoreData;

现在我有一个以 BasicData 作为参数的 C 库函数,我想从 Python 调用它。为此,我构建了一个 ctypes 类:

class BasicData(Structure):
    _fields_ = [("info1", c_int),
                ("info2", c_int),
                ("md", ??????)]

我的问题是我要填写什么????能够将此结构传递给C函数的空间(或者我需要完全不同的东西吗?)。MoreData 仅在计算期间使用,我不需要在我的 Python 代码中读取它,因此将为它分配内存将从 C 库级别处理。我只需要传递一个具有正确指针类型的 BasicData 结构。

4

2 回答 2

2

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

于 2013-08-23T12:34:14.743 回答
1

您需要定义一个class MoreData(Structure)包装另一个结构。然后将其传递为("md", POINTER(MoreData)).

C 保证结构字段是按顺序分配的,所以如果你真的不想md从 Python 访问,那么你可以不指定它_fields_(因为它排在最后)。然后 ctypes 会相信你有一个只有前两个成员的结构。

Ctypes 非常适合一次性访问 C 结构,但如果您经常将 C 代码与 Python 捆绑在一起,那么我真的建议您查看 Cython。

编辑:正如 eryksun 指出的(微弱的双关语),我忘记了 POINTER。

于 2013-08-23T12:37:20.580 回答