gpt4 book ai didi

python - 从另一个对象访问结构指针时遇到问题

转载 作者:太空宇宙 更新时间:2023-11-03 14:21:36 24 4
gpt4 key购买 nike

foo.h

typedef int bar;
typedef struct _foo
{
bar* b;
} foo;
extern foo* foo_new();
extern bar* foo_bar_new(foo* f);

foo.pxd

cdef extern from "foo.h":
ctypedef int bar;
ctypedef struct foo:
bar* b
foo* foo_new();
bar* foo_bar_new(foo* f);

foo.pyx

from foo cimport *

cdef class Foo:
cdef foo* _ptr
def __cinit__(self):
self._ptr = foo_new()

cdef class Bar:
cdef bar* _ptr
def __cinit__(self, f):
self._ptr = foo_bar_new(f._ptr) # error
^
foo.pyx:11:33: Cannot convert Python object to 'foo *'

cython foo.pyx 在标记行处抛出错误。

我不太确定我做错了什么。将 Foo 中的 _ptr 更改为 cpdef 会导致相同的错误。

==更新==我将 foo.pyx 更改为以下内容并且它有效。

from foo cimport *

cdef class Foo:
cdef foo* _ptr
def __cinit__(self):
self._ptr = foo_new()

def new_bar(self):
cdef bar* b
b = foo_bar_new(self._ptr)
tmp = Bar()
tmp._set(b)
return tmp

cdef class Bar:
cdef bar* _ptr
cdef _set(self, bar* bptr):
self._ptr = bptr

def get(self):
return bar_get(self._ptr)

我可以做f=Foo(); b=f.new_bar() 但这对我来说似乎并不理想,因为我无法使用 Bar(f) 或类似的创建。问题是我不能 cdef __cinit__() 因为它是一个特殊的方法。也不能cdef __init__()。关于如何解决这个问题有什么想法吗?

最佳答案

您需要确保它在编译时知道 f 是什么类型:

def __cinit__(self, Foo f):
self._ptr = foo_bar_new(f._ptr) # error

如果不这样做,它必须假设 _ptr 是标准 Python 属性查找(在运行时完成),因此将是标准 Python 对象。如果您指定 fFoo,那么它就能够使用 _ptr 的已知定义。

关于python - 从另一个对象访问结构指针时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47909572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com