2011-12-23 7 views
7

Cython을 사용하여 고유 한 목록 컨테이너를 만들고 싶습니다.Cython에서 C struct 만들기

cdef struct s_intList: 
    int value 
    void* next 
ctypedef s_intList intList 

하지만 구조체 멤버 액세서 시간을 때, 나는 좋은 구문을 찾을 수 없습니다 : 나는 이러한 구조를 만드는 얻을 수있는 문서 다음 아주 새로운 그것에 초심자 및 해요 :

cpdef void foo(): 
    cdef intList* li 
    # li.value OR li->value 

예외 : "경고 : intlists.pyx : 8 : 12 : 할당하기 전에 참조 된 지역 변수 '리'"내 사이 썬 구조체의 사용이 잘못되었다고 가정하자 ...

어떤 생각을 내가 여기서 뭘 잘못하고 있니? :) 도움을 주셔서 감사합니다.

+0

''void '를 Python object'로 변환 할 수 없지만, 오류가 없다고 수정하면 얻을 수 있습니다. 오래된 Cython 버전을 사용 중이거나 코드의 관련 부분을 표시하지 않았습니다. –

답변

9

intList에 대한 메모리를 할당해야합니다. 로컬 변수 또는 malloc을 사용하십시오. 코드에서

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

cpdef object foo(): 
    cdef intList li 
    li.value = 10 
+0

니스! '객체'반환 유형이 누락 된 것 같습니다. 이 문서는 어디서나 볼 수 있습니까? :-) 대단히 감사합니다! – Oleiade

+0

또는 'object'를 생략하십시오. 적어도 Cython 0.16에서는'None'을 반환해야합니다. –

4

liintList포인터입니다. 이 포인터는 아무 것도 가리 키도록 초기화되지 않으므로 li.value에 액세스하는 것은 의미가 없으며 오류가 발생합니다.

fabrizioM의 답변에서 스택에 intList이 생성되었으므로 (포인터가 아닙니다) 메모리에 li.value으로 예약 된 위치가 있습니다.

intList 실제 데이터 (링크 된 목록 데이터 구조와 같음)를 만들려면이 intList을 함수 등에서 반환 할 수 있어야합니다. intList 구조체를 힙에 할당하고 거기에서 전체 링크 된 목록을 작성하십시오. Cython을 사용하면 쉽게 malloc (및 free)으로 전화를 걸 수 있습니다.