我正在尝试使用Cython编写一个围绕C ++库的包装器。但是,我现在遇到了一个问题,因为库中的一个函数采用参数const char**
。显然,C ++无法进行这种转换,(Why am I getting an error converting a ‘float**’ to ‘const float**’?)让我处于两难境地,因为我传入一个字符串列表,让我们将它称为x
进入函数,我正在尝试生成相应的char **对象,让我们使用malloc和for循环调用它a
:
def f(x):
cdef char** a = <char**> malloc(len(x) * sizeof(char*))
for index, item in enumerate(x):
a[index] = item
......
这里有解决方法吗?我唯一能想到的是使用const_cast
,我找不到是否在Cython中实现的任何细节....
答案 0 :(得分:2)
以下代码在cPython V20.0中编译。这会解决你的问题吗?
# distutils: language = c++
from libc.stdlib cimport malloc
def f(x):
cdef const char** a = <const char**> malloc(len(x) * sizeof(char*))
for index, item in x:
a[index] = item
答案 1 :(得分:0)
有一个旧answer,但我会稍微改变to_cstring_array
(使用strdup
,不使用PyString_AsString
)
from libc.stdlib cimport malloc, free
from libc.string cimport strdup
cdef char ** to_cstring_array(list strings):
cdef const char * s
cdef size_t l = len(strings)
cdef char ** ret = <char **>malloc(l* sizeof(char *))
# for NULL terminated array
# cdef char ** ret = <char **>malloc((l + 1) * sizeof(char *))
# ret[l] = NULL
for i in range(l):
s = strings[i]
ret[i] = strdup(s)
return ret