Cython创建含动态数组的结构体并跨函数传递,编译失败求助
你的Cython结构体代码编译失败的问题分析与修复
核心错误点:
语法错误:错误使用HTML转义字符
代码里的<float *>和<int *>是HTML环境下的小于号转义字符,Cython编译器无法识别,必须替换为Cython标准的强制类型转换语法<float*>和<int*>。未定义变量引用
wrap函数中的for i in range(len)里,len是未定义的变量,应该替换为函数传入的参数wind_len。函数返回类型写法兼容问题
部分Cython版本对cdef StructNew(int len) -> Struct这种箭头式返回类型支持不好,建议改用传统的cdef Struct StructNew(int len)定义方式。
修正后的完整代码
from libc.stdlib cimport malloc, free ctypedef struct Struct: float* float_array int* int_array cdef Struct StructNew(int len): cdef Struct s # 修正类型转换语法 s.float_array = <float*> malloc(len * sizeof(float)) s.int_array = <int*> malloc(len * sizeof(int)) for i in range(len): s.float_array[i] = i s.int_array[i] = i return s cdef wrap(int wind_len): cdef Struct s = StructNew(wind_len) # 替换未定义的len为传入的wind_len for i in range(wind_len): print(s.float_array[i]) # 补充内存释放逻辑,避免内存泄漏 free(s.float_array) free(s.int_array)
额外说明
修正后的代码解决了编译报错的问题,同时添加了free调用释放分配的堆内存,避免运行时出现内存泄漏问题。
内容的提问来源于stack exchange,提问作者Gideon Kogan
相关产品推荐
相关产品推荐

