Cython如何将char **转换为const char **?

时间:2016-07-13 05:23:54

标签: python c++ cython

我正在尝试使用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中实现的任何细节....

2 个答案:

答案 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