You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Cython中处理C的typedef?以调用Cuba库Cuhre函数为例

在Cython中调用Cuba库的Cuhre方法:处理typedef函数指针

你已经正确声明了Cuhre函数,但核心问题是要先在Cython中显式声明integrand_t这个typedef的函数指针类型——Cython无法自动解析头文件里的typedef细节,必须手动对应定义它。

步骤1:声明integrand_t类型

先打开cuba.h找到integrand_t的原始定义,它应该是类似这样的函数指针:

typedef void (*integrand_t)(const int *ndim, const double xx[], const int *ncomp, double ff[], void *userdata);

把这个类型用Cython语法在你的.pyx文件顶部声明:

# 先声明integrand_t函数指针类型,匹配C头文件的定义
ctypedef void (*integrand_t)(const int* ndim, const double* xx, const int* ncomp, double* ff, void* userdata)

步骤2:定义符合类型的回调函数

接下来写一个完全匹配integrand_t签名的Cython函数,作为传给Cuhre的积分回调逻辑:

cdef void my_integrand(const int* ndim, const double* xx, const int* ncomp, double* ff, void* userdata):
    # 这里编写你的被积函数逻辑
    # 示例:假设是1维积分,计算输入变量xx[0]的平方
    ff[0] = xx[0] * xx[0]
    # 如果有多个积分分量(ncomp>1),继续给ff[1]、ff[2]等赋值

步骤3:正常调用Cuhre函数

现在就可以传入回调函数调用Cuhre了,同时处理其他参数:

# 初始化调用所需的变量
cdef int ndim = 1
cdef int ncomp = 1
cdef double epsrel = 1e-8
cdef double epsabs = 1e-12
cdef int flags = 0
cdef int mineval = 0
cdef int maxeval = 100000
cdef int key = 0
cdef int nregions, neval, fail
cdef double integral[1], error[1], prob[1]

# 调用Cuhre积分函数
Cuhre(ndim, ncomp, my_integrand, epsrel, epsabs, flags, mineval, maxeval, key, &nregions, &neval, &fail, integral, error, prob)

# 输出结果
print(f"积分结果: {integral[0]}, 估算误差: {error[0]}")

额外注意事项

  • 如果需要传递Python对象作为userdata,可以将其转换为void*,但要注意手动管理引用计数避免被GC回收,比如用cast(void*, my_python_obj),或者更安全的Cython capsule机制。
  • 编译时要确保链接Cuba库,比如在setup.py的扩展配置中添加libraries=['cuba']。

内容的提问来源于stack exchange,提问作者paulinho

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:07:35