【问题标题】:ctypes - passing a struct with a pointer to another structctypes - 传递一个带有指向另一个结构的指针的结构
【发布时间】:2013-08-26 12:00:07
【问题描述】:

在我的 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 结构。

【问题讨论】:

    标签: python c dll ctypes


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

      • 我读到这个问题是因为 BasicData 结构由 ctypes 分配并传递给一个函数。在这种情况下,它至少需要一个c_void_p。如果确实定义了MoreData 结构,则该字段将是("md", POINTER(MoreData))
      • 同意,看有没有C代码访问md
      猜你喜欢
      • 1970-01-01
      • 2017-07-13
      • 1970-01-01
      • 1970-01-01
      • 2018-04-25
      • 1970-01-01
      • 2014-01-28
      • 1970-01-01
      • 2016-09-24
      相关资源
      最近更新 更多