【问题标题】:How do I pass a pointer to a c function in Cython?如何将指针传递给 Cython 中的 c 函数?
【发布时间】:2011-12-02 07:31:37
【问题描述】:

我正在尝试使用自定义比较函数在 Cython 中调用 qsort,但我不明白如何传递函数引用。首先,我有一个结构:

cdef struct Pair:
    int i,j
    float h

比较函数按h排序:

cdef int compare(const_void *a, const_void *b):
    cdef float v = ((<Pair*>a)).h-((<Pair*>b)).h
    if v < 0: return -1
    if v > 0: return 1
    return 0

这是我遇到问题的部分:

    cdef Pair[5] pa
    for i in range(5):
        pa[i].i = i;
        pa[i].j = i*2;
        pa[i].h = i*.5;
    qsort(pa,5,sizeof(Pair),compare)

最后一行不会编译并生成此错误,我认为这与我无法弄清楚如何将compare 作为对qsort 的引用的事实有关:

Cannot assign type 'int (const_void *, const_void *)' to 'int (*)(const_void *, const_void *) nogil'

【问题讨论】:

    标签: cython


    【解决方案1】:

    我无法重现您的错误。您使用的代码是正确的,并且可以使用 Cython 0.15。我看到的唯一可能是您的错误的是附加到类型的“gil”。如果您想明确将导入的方法声明为“gil safe”,请在声明末尾附加“nogil”。

    (请注意,您可以使用 cython -a 检查您的 python 代码,然后打开网络浏览器)

    来自“stdlib.h”的 cdef extern: ctypedef void const_void "const void" void qsort(void *base, int nmemb, int size, int(*compar)(const_void *, const_void *)) cdef 结构对: 整数 i,j 浮动 h cdef int 比较(const_void *a,const_void *b): cdef float v = ((a)).h-((b)).h print 'do something with', v 如果 v 0:返回 1 返回 0 定义 r(): cdef 对[5] pa 对于范围内的 i (5): 帕[i].i = i; pa[i].j = i*2; pa[i].h = i*.5; 打印'调用qsort' qsort(pa,5,sizeof(Pair),比较) print '调用 qsort 完成' r()

    这个sn-p编译为:

    $ cython--版本 Cython 0.15 版 $ cython --embed test.pyx $ gcc -I/usr/include/python2.7 -Wall -std=c99 test.c -lpython2.7 $ ./a.out 调用 qsort 用 -0.5 做某事 用 -0.5 做某事 用 -0.5 做某事 用 -1.0 做某事 用 -0.5 做某事 调用 qsort 完成

    【讨论】:

    • 我有一个Cython post,您或许可以提供见解。
    猜你喜欢
    • 1970-01-01
    • 2020-09-14
    • 2020-06-17
    • 2018-09-13
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多