首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Cython中的bsearch

Cython中的bsearch
EN

Stack Overflow用户
提问于 2022-09-15 08:48:44
回答 1查看 34关注 0票数 0

我正在学习Cython的libc.bsearch,因为它试图使用Cython获取排序数组中的索引。该示例来自这个问题,并进行了修改:

代码语言:javascript
复制
## test_bsearch.pyx

cimport cython
from libc.stdlib cimport bsearch

cdef int comp_fun(const void *a, const void *b) nogil:
    cdef int a_v = (<int*>a)[0]
    cdef int b_v = (<int*>b)[0]

   if a_v < b_v:
       return -1
   elif a_v > b_v:
       return 1
   else:
       return 0


def bsearch_c(int[::1] t, int v):
    cdef int *p  = <int*> bsearch(&v, &t[0], t.shape[0], sizeof(int), &comp_fun)
    cdef int j = <int> p

    if p != NULL:
        return j
    else:
        return -1

然后我创建了一个setup.py

代码语言:javascript
复制
from distutils.core import setup
from Cython.Build import cythonize


setup(
    ext_modules=cythonize([
        "test_bsearch.pyx"
    ],
        compiler_directives={'language_level': "3"}
    ),
    include_dirs=[
        np.get_include()
    ]
)

并在命令提示符:Win10中编译了代码:python setup.py build_ext -i。但是,按照以下方式运行它得到了一个奇怪的结果:

代码语言:javascript
复制
>>> from test_bsearch import bsearch_c
>>> import numpy as np
>>> x = np.arange(20, dtype=np.int32)
>>> bsearch_c(x, 5)  # got 610183044

我对C++一无所知,所以不知道上面的实现有什么问题。如何纠正?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-09-15 11:20:43

代码语言:javascript
复制
cdef int j = <int> p

这是一个指向int的指针。你想要的

代码语言:javascript
复制
cdef int j = p[0]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73728167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档