2011-12-23 42 views
7

Tôi muốn tạo vùng chứa danh sách rất riêng của mình bằng cách sử dụng Cython. Tôi là một người ăn xin rất mới với nó, và làm theo các tài liệu tôi có thể tạo ra một cấu trúc như vậy:Tạo cấu trúc C trong Cython

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

nhưng khi đến lúc truy cập thành viên cấu trúc, tôi không thể tìm ra cú pháp tốt:

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

ném: "cảnh báo: intlists.pyx: 8: 12: biến cục bộ 'li' tham chiếu trước khi chuyển nhượng" mà hãy để tôi giả định rằng việc sử dụng cấu trúc cython của tôi là không chính xác ...

Bất kỳ ý tưởng về những gì tôi đang làm sai ở đây? :) Cảm ơn bạn đã giúp bạn

+0

Tôi nhận được 'Không thể chuyển đổi' void 'thành đối tượng Python', nhưng nếu tôi khắc phục rằng không có lỗi. Bạn có phiên bản Cython cũ hoặc bạn không hiển thị phần có liên quan của mã. –

Trả lời

9

Bạn phải cấp phát bộ nhớ cho intList. Hoặc với một biến địa phương hoặc sử dụng malloc.

cdef struct s_intList: 
    int value 
    void* next 

ctypedef s_intList intList 

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

Rất tuyệt! Có vẻ như tôi đã thiếu kiểu trả về 'đối tượng'. Bất kỳ tài liệu nào về điều này ở bất cứ đâu? :-) Cảm ơn bạn rất nhiều! – Oleiade

+0

Cách khác, bỏ 'đối tượng'. Ít nhất trong Cython 0,16, nó sẽ trả về 'None'. –

4

Trong code của bạn, li là một con trỏ một intList. Con trỏ này không được khởi tạo để trỏ tới bất kỳ thứ gì, vì vậy việc truy cập li.value là vô nghĩa (và sai).

Trong câu trả lời của fabrizioM, một intList được tạo (không phải là con trỏ đến một) trên ngăn xếp, do đó, có một vị trí trong bộ nhớ dành riêng cho li.value.

Nếu bạn muốn tạo một intList với dữ liệu thực tế (mà tôi thu thập bạn có ý định trở nên giống như một cấu trúc dữ liệu danh sách liên kết), và nếu bạn muốn để có thể quay trở lại mà intList từ chức năng, vv bạn sẽ phải phân bổ các cấu trúc intList của bạn trên heap và xây dựng danh sách được liên kết đầy đủ từ đó. Cython cho phép bạn gọi số malloc (và free) dễ dàng để thực hiện việc này.

Các vấn đề liên quan