13

structCython のグルー宣言で、無名共用体を含むC の型をどのように表現すればよいですか? たとえば、次の内容mystruct.hを含むC ヘッダー ファイルがあるとします。

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;};

しかし、それは私に「C変数宣言の構文エラー」を与えただけでしたunion

4

2 に答える 2

14

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メモリ レイアウトではなく、テキスト置換で動作するため、これらが無名の共用体または構造体にあるかどうか、または何を持っているかは気にしません。

于 2015-01-15T01:12:29.727 に答える
9

私の知る限り、宣言をネストすることはできません。また、Cython は匿名の共用体をサポートしていません。

次のことを試してください。

cdef union mystruct_union:
    double lower_d
    uint64_t lower

cdef struct mystruct:
    mystruct_union un

un.lower_dここで、およびとして共用体メンバーにアクセスしますun.lower

于 2012-09-17T01:54:36.680 に答える