2016-07-13 7 views
1

Cython을 사용하여 C++ 라이브러리 주위에 래퍼를 작성하려고합니다. 그러나 라이브러리의 함수 중 하나가 매개 변수 const char**을 사용하므로 문제가 발생합니다. 명백하게, C++은 문자열 목록을 전달할 때이 딜레마에 빠지게하는이 변환 (Why am I getting an error converting a ‘float**’ to ‘const float**’?)을 수행 할 수 없습니다.이 함수를 x이라고 부르 자요. 해당 char ** 객체를 생성하려고합니다. ,의는 루프의 malloc과를 사용하여, 그것을 a을 부르 자 :Cython에서 char **을 const char **로 변환하는 방법?

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

다음 코드는 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

, 감사합니다! – Alex

+0

목록'x'가 어딘가에서 참조되는 한 작동합니다. 그 후, 배열은 할당이 해제되어 재사용 될 수있는 메모리 위치를 가리 킵니다. 또한'x'의 내용을 변경하면 문제가 발생할 수 있습니다. –

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 
관련 문제