如何在ctypes中返回指向结构的指针?

Fra*_*ter 9 c python ctypes pointers structure

我尝试传递一个结构的指针,该结构从函数'bar'返回给函数'foo_write'作为返回值.但是我得到'foo = POINTER(temp_foo)'行的错误消息'TypeError:必须是ctypes类型'.在ctypes在线帮助中,我发现'ctypes.POINTER'仅适用于ctypes类型.你知道另一种方式吗?你会推荐什么?

C:

typedef struct FOO_{
    int i;
    float *b1;
    float (*w1)[];
}FOO;

foo *bar(int foo_parameter) {...
void foo_write(FOO *foo)
Run Code Online (Sandbox Code Playgroud)

Python与ctypes:

class foo(Structure):
    _fields_=[("i",c_int),
              ("b1",POINTER(c_int)),
              ("w1",POINTER(c_float))]

temp_foo=foo(0,None,None)
foo = POINTER(temp_foo)
foo=myclib.bar(foo_parameter)
myclib.foo_write(foo)
Run Code Online (Sandbox Code Playgroud)

小智 6

更改

foo = POINTER(temp_foo)
Run Code Online (Sandbox Code Playgroud)

至

foo = pointer(temp_foo)
Run Code Online (Sandbox Code Playgroud)

可以解决问题.

有关更多信息,请参阅http://docs.python.org/library/ctypes.html#ctypes-pointers.


ric*_*chq 5

你的bar函数定义不正确,我想你的意思是struct FOO_ *bar(int);?

Python代码在foo_parameter从未声明的意义上是错误的,所以我不是100%确定你想要做什么.我假设你想要将你声明的python声明的参数(foo它是a的一个实例)传递给struct FOO_C bar(int)并返回一个指针struct FOO_.

您不需要POINTER来执行此操作,以下操作:

#!/usr/bin/env python
from ctypes import *

class foo(Structure):
    _fields_=[("i",c_int),
              ("b1",POINTER(c_int)),
              ("w1",POINTER(c_float))]

myclib = cdll.LoadLibrary("./libexample.so")
temp_foo = foo(1,None,None)
foovar = myclib.bar(temp_foo.i)
myclib.foo_write(foovar)
Run Code Online (Sandbox Code Playgroud)

因为CTypes会将返回类型包装bar()在指向结构的指针中.

  • foo是一个类名,还是一个变量?c_types如何知道bar的返回类型是'foo'? (4认同)