2012-09-17 22 views
8

Cython tutkal bildirimlerinde, anonim birleşim içeren bir C struct türünü nasıl temsil edebilirim?Cython: Yapı içindeki bir birleşimi iç içe geçirme

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

ama sadece bana verdiği ": Ne tekabül .pyd dosyası

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

yılında, daha sonra

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

içeren mystruct.h bir C başlık dosyanız varsa Örneğin, bu çalıştı union satırında C değişken beyanındaki sözdizimi hatası.

+5

Bu sorunun neden kapatıldığını anlamıyorum. Diğer Cython kullanıcıları için oldukça yararlı görünüyor, iyi bir başlık ve etiketler ve nihayet kabul edilmiş bir cevabı var. Nasıl "çok lokalize"? – user4815162342

+0

Evet, bu sorunun ifadesi son derece uzmanlaşmış bir ses çıkardı, ancak aslında karmaşık bir C kütüphanesini bir Python uzantısına yapıştırmaya çalışan herkesin karşılaşabileceği genel bir problem. Sorudaki kodun genel bir senaryonun sadece bir örneği olduğunu açıklığa kavuşturmaya çalıştım. – zwol

cevap

6

Bildirimlerimi en iyi bilgilerime yerleştiremezsiniz ve Cython, anonim sendikalar AFAIK'ı desteklemez.

aşağıdaki deneyin:

cdef union mystruct_union: 
    double lower_d 
    uint64_t lower 

cdef struct mystruct: 
    mystruct_union un 

Şimdi un.lower_d ve un.lower olarak sendika üyelerini erişin.

6

Buraya Google üzerinden gelenler için bir çözüm buldum. Eğer bir yapı varsa:

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

Çok gibi Cython bildiriminde hepsini doğrulmak edebilirsiniz:

ctypedef struct outer: 
    int a 
    int b 
    int c 

Cython bellek düzeni hakkında herhangi suppositions yapan herhangi bir kod oluşturmayan yapınız; Sadece ona, ne demek istediğini söyleyebilmek için hangi sözdiziminin üretildiğini söyleyerek söylediğiniz şeyin fiili yapısını anlatıyorsunuz. Yapınızın ((outer) x).a olarak erişilebilen int boyutuna sahip bir üyesi varsa, a yapı tanımına atabilir ve işe yarayacaktır. Bu metin düzeni değil, metinsel ikame üzerinde çalışıyor, bu yüzden bu şeylerin anonim sendikalar veya yapıda olup olmadığına veya neyin var olduğuna bakmıyor.

+0

Kodumda benzer bir şey denemek, derlemenin 'b' adında bir üye olmadığını söyleyen bir derleme hatasına neden oldu. – Noich

+0

@Noich: Cython ve C kodunuzla bir macun veya bir şey mi aldınız? Bir bakabilirim. –

+0

C kodu burada https://pastebin.com/psTBpJut Adlandırılmış bir yapıyı deneyin: https://pastebin.com/jH7Rqsu1 Düzleştirmek için: https://pastebin.com/T8GGgKtA Teşekkürler! – Noich

İlgili konular