2012-09-17 41 views
8

Trong khai báo keo Cython, làm cách nào để biểu thị loại C struct có chứa một liên kết ẩn danh? Ví dụ, nếu tôi có một tập tin header C mystruct.h chứaCython: Làm tổ hợp nhất trong cấu trúc

struct mystruct 
{ 
    union { 
     double da; 
     uint64_t ia; 
    }; 
}; 

sau đó, trong tương ứng .pyd tập tin

cdef extern from "mystruct.h": 
    struct mystruct: 
     # what goes here??? 

Tôi cố gắng này:

cdef extern from "mystruct.h": 
    struct mystruct: 
     union {double da; uint64_t ia;}; 

nhưng điều đó chỉ cho tôi " Lỗi cú pháp trong khai báo biến C "trên dòng union.

+5

Tôi không hiểu tại sao câu hỏi này bị đóng. Nó xuất hiện hợp lý hữu ích cho người dùng Cython khác, nó có một tiêu đề và thẻ tốt, và cuối cùng là một câu trả lời được chấp nhận. Làm thế nào là nó "quá địa hoá"? – user4815162342

+0

Vâng, biểu hiện của câu hỏi này làm cho nó có vẻ chuyên môn cao, nhưng nó thực sự là một vấn đề chung mà bất cứ ai cố gắng để dán một thư viện C phức tạp vào một phần mở rộng Python có thể phải đối mặt. Tôi đã cố gắng làm cho nó rõ ràng hơn rằng mã trong câu hỏi chỉ là một ví dụ về một kịch bản chung. – zwol

Trả lời

6

Bạn không thể lồng các khai báo theo sự hiểu biết tốt nhất của mình và Cython không hỗ trợ các tổ chức vô danh AFAIK.

Hãy thử như sau:

cdef union mystruct_union: 
    double lower_d 
    uint64_t lower 

cdef struct mystruct: 
    mystruct_union un 

Bây giờ truy cập vào đoàn viên như un.lower_dun.lower.

6

Đối với những người đến đây thông qua Google, tôi đã tìm thấy giải pháp cho điều này. Nếu bạn có một cấu trúc:

typedef struct { 
    union { 
     int a; 
     struct { 
      int b; 
      int c; 
     }; 
    } 
} outer; 

Bạn có thể san bằng tất cả ra trong tờ khai Cython, như vậy:

ctypedef struct outer: 
    int a 
    int b 
    int c 

Cython không tạo ra bất kỳ mã mà làm cho bất kỳ giả định về cách bố trí bộ nhớ của cấu trúc của bạn; bạn chỉ nói với nó cấu trúc thực tế của những gì bạn đang gọi bằng cách cho nó biết cú pháp nào tạo ra để gọi nó. Vì vậy, nếu cấu trúc của bạn có thành viên có kích thước int có thể được truy cập là ((outer) x).a, thì bạn có thể ném a vào định nghĩa cấu trúc và nó sẽ hoạt động. Nó hoạt động trên thay thế văn bản, không phải bố trí bộ nhớ, do đó, nó không quan tâm về việc những điều này là trong các hiệp hội ẩn danh hoặc cấu trúc hoặc những gì có bạn.

+0

Thử một cái gì đó tương tự trong mã của tôi gây ra một lỗi biên dịch, nói rằng bên ngoài không có thành viên có tên 'b'. – Noich

+0

@Noich: có một con nhộng hay một cái gì đó với mã Cython và C của bạn? Tôi có thể xem. –

+0

Mã C ở đây https://pastebin.com/psTBpJut Thử cấu trúc có tên: https://pastebin.com/jH7Rqsu1 Cố gắng làm phẳng: https://pastebin.com/T8GGgKtA Cảm ơn! – Noich

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