python ctype递归结构

Eri*_*ric 9 python dll recursion ctypes structure

我在C中为驱动程序开发了一个DLL.我用C++编写了一个测试程序,DLL运行正常.

现在我想使用Python来处理这个DLL.我已成功隐藏了大多数用户定义的C结构,但有一点我必须使用C结构.我对python很新,所以我可能会弄错.

我的方法是使用ctype在python中重新定义一些结构,然后将变量传递给我的DLL.但是在这些类中,我有一个自定义链表,其中包含递归类型,如下所示

class EthercatDatagram(Structure):
    _fields_ = [("header", EthercatDatagramHeader),
                ("packet_data_length", c_int),
                ("packet_data", c_char_p),
                ("work_count", c_ushort),
                ("next_command", EthercatDatagram)]
Run Code Online (Sandbox Code Playgroud)

这失败了,因为在EthercatDatagram中,尚未定义EthercatDatagram,因此解析器返回错误.

我应该如何在python中表示这个链表,以便我的DLL能够正确理解它?

use*_*876 15

你几乎肯定想要将next_command声明为指针.拥有一个包含自身的结构是不可能的(用任何语言).

我想这就是你想要的:

class EthercatDatagram(Structure):
    pass
EthercatDatagram._fields_ = [
    ("header", EthercatDatagramHeader),
    ("packet_data_length", c_int),
    ("packet_data", c_char_p),
    ("work_count", c_ushort),
    ("next_command", POINTER(EthercatDatagram))]
Run Code Online (Sandbox Code Playgroud)

  • “不可能(在任何语言中)”——这对于 c/c++/java 风格的结构或类是正确的,但在具有代数数据类型的语言中,这不仅可能而且非常普遍。例如`data List a = Cons a (List a) | ML 系列语言(ocaml/haskell/SML/etc)中的 Nil`。 (2认同)
  • 在这些语言中,它仍然被实现为指针;该语言只是抽象了指针的细节。结构体是一个连续的内存序列,具有固定的大小(由其组件大小的总和决定),因此要包含其自身的副本,它必须比自身大,这是不可能的。 (2认同)