Berinteraksi dengan struct dan unions anonim dengan c2hs

100

Bagaimana cara mengkodekan potongan kode C ini dalam file .chs sehingga c2hs dapat mengubahnya menjadi sesuatu yang relatif bagus?

typedef enum {
    MONOME_BUTTON_UP        = 0x00,
    MONOME_BUTTON_DOWN      = 0x01,
    MONOME_ENCODER_DELTA    = 0x02,
    MONOME_ENCODER_KEY_UP   = 0x03,
    MONOME_ENCODER_KEY_DOWN = 0x04,
    MONOME_TILT             = 0x05,

    /* update this if you add event types */
    MONOME_EVENT_MAX        = 0x06
} monome_event_type_t;

typedef struct monome monome_t; /* opaque data type */
typedef struct monome_event monome_event_t;

typedef void (*monome_event_callback_t)
    (const monome_event_t *event, void *data);

struct monome_event {
    monome_t *monome;
    monome_event_type_t event_type;

    /* __extension__ for anonymous unions in gcc */
    __extension__ union {
        struct {
            unsigned int x;
            unsigned int y;
        } grid;

        struct {
            unsigned int number;
            int delta;
        } encoder;

        struct {
            unsigned int sensor;
            int x;
            int y;
            int z;
        } tilt;
    };
};
amn
sumber
12
Akan lebih produktif jika Anda benar-benar mencoba memecahkan masalah terlebih dahulu, kemudian mengajukan pertanyaan khusus tentang bahasa dan / atau alat. Pertanyaan yang menjadi inti dari kebingungan, dan menghindari kerumitan aplikasi tertentu yang tidak perlu, bahkan lebih baik. Misalnya, Anda bisa bertanya tentang struct sederhana dan / atau tentang penyatuan sederhana kemudian menerapkan pengetahuan itu ke masalah Anda.
Thomas M. DuBuisson
2
@ ThomasM.DuBuisson Saya pikir Anda membuat poin yang masuk akal. Saya akan membahas ini sedikit lebih jauh.
@unsymbol Apakah Anda punya jawaban untuk pertanyaan Anda? Mohon pertimbangkan untuk menambahkannya di sini :)
alfakini
1
Hai unsymbol, ada berita tentang ini? Apakah Anda membuatnya berfungsi dan bagaimana?
Casper Thule Hansen

Jawaban:

1

Bagaimana dengan ini: ubah kode sehingga Anda memberi nama anggota. Tata letak dalam memori sama sehingga akan kompatibel dengan biner. Anda harus melakukan tambalan ini untuk setiap versi lib.

struct monome_event {
    monome_t *monome;
    monome_event_type_t event_type;

    /* __extension__ for anonymous unions in gcc */
    __extension__ union {
        struct me_grid {
            unsigned int x;
            unsigned int y;
        } grid;

        struct me_encoder {
            unsigned int number;
            int delta;
        } encoder;

        struct me_tilt {
            unsigned int sensor;
            int x;
            int y;
            int z;
        } tilt;
    };
};
h4ck3rm1k3
sumber