2012-09-17 59 views
8

在Cython粘貼聲明中,如何表示包含匿名聯合的C struct類型?舉例來說,如果我有一個C頭文件mystruct.hCython:在結構中嵌套union

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

然後,在相應的.pyd文件

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

我嘗試這樣做:

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

但只給了我「在union行上的「C變量聲明中的語法錯誤」。

+5

我不明白爲什麼這個問題已經關閉。它似乎對其他Cython用戶有合理的幫助,它有一個很好的標題和標籤,最後是一個被接受的答案。它是如何「太本地化」? – user4815162342

+0

是的,這個問題的表達使得它聽起來高度專業化,但實際上它是一個普通的問題,任何人試圖將複雜的C庫粘貼到Python擴展中可能會遇到。我試圖弄清楚問題中的代碼只是一個通用場景的例子。 – zwol

回答

6

您不能嵌套聲明,據我所知,Cython不支持匿名聯合AFAIK。

嘗試以下操作:

cdef union mystruct_union: 
    double lower_d 
    uint64_t lower 

cdef struct mystruct: 
    mystruct_union un 

現在訪問工會成員un.lower_dun.lower

6

對於那些通過Google來到這裏的人,我找到了解決方案。如果你有一個結構:

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

您可以拼合這一切在用Cython聲明,就像這樣:

ctypedef struct outer: 
    int a 
    int b 
    int c 

用Cython不會產生,使有關的內存佈局任何的假定任何代碼你的結構;你只是通過告訴它事實上的結構來告訴它什麼語法來生成它來調用它。所以如果你的結構有一個大小爲int的成員可以作爲((outer) x).a來訪問,那麼你可以在結構定義上拋出a,它將起作用。它在文本替換上運行,而不是內存佈局,所以它不關心這些東西是匿名工會還是結構,或者你有什麼。

+0

在我的代碼中嘗試類似的東西導致編譯錯誤,說外層沒有名爲'b'的成員。 – Noich

+0

@Noich:用你的Cython和C代碼得到一個pastebin或者什麼東西?我可以看看。 –

+0

C代碼在這裏https://pastebin.com/psTBpJut 嘗試命名結構:https://pastebin.com/jH7Rqsu1 試圖拼合:https://pastebin.com/T8GGgKtA 謝謝! – Noich