2012-03-19 3 views
0

는 나는 사이 썬의 방법으로 전달되는 바이트 문자열을 가지고, 나는 C 함수로 전달해야합니다 내가 C-땅 내부의 구조체에 저장되어 전달어떻게 cython 변수를 활성 상태로 유지합니까?

def stuff(bytes b): 
    #b is b'something' 
    some_c_function(b, len(b)) 

포인터. 그것이 사용될 때까지 b이 사라 졌으므로 세그먼트 오류가 발생합니다. 함수 밖에서 어떻게 살아야합니까?

나는이 같은 시도 :

from libc.stdlib import malloc, memcpy 

def stuff(bytes b): 
    cdef char *data 
    data_len = len(b) 
    data = malloc(data_len) 
    memcpy(data, b, data_len) 
    some_c_function(data, data_len) 

을하지만 난 malloc 호출에 오류가 발생합니다 : Obtaining char * from temporary Python value합니다.

답변

1
  1. 당신은 그렇지 사이 썬은 기본 파이썬 가져 오기로 가져 오기를 처리하고 malloc는 일반 파이썬 함수이다 생각의 malloc 기능을 cimport해야합니다.

  2. data_lenlen(b) + 1되어야하고 최종 바이트, 즉
    data[data_len - 1] = 0, 0로 설정되어야한다. 이것은 C/C++에서 문자열이 끝나는 방법입니다.

  3. cimport -ed malloc을 입력하고 Cython에서이 함수를 C 함수로 처리하면 캐스트를 만들어야합니다. 그렇지 않으면 Cython 컴파일러에서 불평합니다.

    data = <char*> malloc(data_len)

  4. 당신malloc -ed가 무엇 자신에 의해 을 해제해야합니다. 이것이 일어날 수 있도록하십시오.

관련 문제