2012-09-17 18 views
8

Cythonのグルーの宣言で、匿名の共用体を含むC structの型を表すにはどうすればいいですか?Cython:構造体内に共用体をネストする

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

だけくれたこと」:私は対応.pydファイル

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

で、次いで

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

を含むmystruct.h Cヘッダファイルがある場合、例えば、私は、この試み「C変数宣言の構文エラー」のunion行にあります。

+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を介してここに来た人には、私はこれに対する解決策を見つけました。あなたは構造体がある場合:

ctypedef struct outer: 
    int a 
    int b 
    int c 

Cythonはのメモリレイアウトについての仮定を作る任意のコードを生成していない:

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

をあなたはそうのような、Cython宣言でそのすべてを平らすることができますあなたの構造体。あなたはそれを呼び出すためにどのような構文を生成するかを伝えることによって、あなたが呼んでいるものの事実上の構造だけをそれに伝えます。したがって、構造体に((outer) x).aとしてアクセスできるサイズがintのメンバーの場合は、構造体定義にaを投げても問題ありません。メモリのレイアウトではなくテキスト置換で動作しているので、これらのものが匿名の共用体や構造体にあるかどうかは気にしません。

+0

私のコードで何か似たようなことを試みると、コンパイルエラーが発生しました。外側に 'b'という名前のメンバーはありません。 – Noich

+0

@ノーイチ:あなたのCythonとCコードでペーストビンなどを手に入れましたか?私は一見することができます。 –

+0

Cコードはhttps://pastebin.com/psTBpJutにあります 名前付き構造体を試してみましょう:https://pastebin.com/jH7Rqsu1 フラット化しようとしています:https://pastebin.com/T8GGgtA ありがとう! – Noich

関連する問題