我正在尝试编写一个函数,该函数在某些条件下将指向结构的指针更改为指向不同的结构。
我的约束是我想保留初始函数签名,该签名将指向指针(而不是特定结构类型)的通用指针作为参数。
这行不通:
[nav] In [5]: %%cython -f
...: ctypedef struct A:
...: int x
...: int y
...:
...: cdef fn(void **m):
...: # Arbitrary code that changes m[0] to point to another structure
...: pass
...:
...: cdef A a
...: cdef A *ap = &a
...: a.x = 2
...: a.y = 3
...: print(ap.x)
...: fn(&ap)
...: print(ap.x)
Error compiling Cython file:
------------------------------------------------------------
...
cdef A a
cdef A *ap = &a
a.x = 2
a.y = 3
print(a.x)
fn(&ap)
^
------------------------------------------------------------
/home/me/.cache/ipython/cython/_cython_magic_3c3902694eafae18c66cb761d4a6b210.pyx:20:3: Cannot assign type 'A **' to 'void **'
我想这是因为即使我可以编写一个将 avoid *
作为参数并自动将任何传递的指针强制转换为a 的函数void *
,它也不能与指向 void 指针的指针一起使用,对吗?
如果是这样,我如何传递我的结构指针指针,以便ap
可以指向不同的结构?
谢谢。
编辑:
进一步阅读后,我意识到这是一个 C 架构“特性”。这篇有用的文章给出了一些简要说明:
关于指向指针的指针和内存分配的一个观点:尽管由
void *
返回的类型malloc
是“通用指针”,适用于分配给任何类型的指针或从任何类型的指针分配,但假设类型void **
不是“指向指针的通用指针”。我们的allocstr
示例只能用于分配指向 char 的指针。不可能使用通过指针间接返回通用指针的函数void **
,因为当您尝试使用它时,例如通过声明和调用
double *dptr;
if(!hypotheticalwrapperfunc(100, sizeof(double), &dptr))
fprintf(stderr, "out of memory\n");
你不会通过一个
void **
,而是一个double **
.
我认为此时我可以做的是在我的函数签名中指定数据类型,或者返回新分配的值?
我通过传递函数要求的内容来解决,即 a void **
,然后在我需要它时投射它:
[nav] In [5]: %%cython -f
...: ctypedef struct A:
...: int x
...: int y
...:
...: cdef fn(void **m):
...: # Arbitrary code that changes m[0] to point to another structure
...: pass
...:
...: cdef A a
...: cdef void *avp = <void *>&a
...: cdef A *ap = <A*>avp
...: a.x = 2
...: a.y = 3
...: print(ap.x)
...: fn(&ap)
...: ap = <A*>avp # Must reassign
...: print(ap.x)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句