Взаємодія з структурами та анонімними спілками з c2hs


100

Як можна було б кодувати цей фрагмент коду С у файлі .chs, щоб c2hs міг перетворити його на щось порівняно приємне?

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

12
Для вас більш продуктивним буде спершу спробувати вирішити проблему спочатку, а потім поставити конкретні запитання щодо мови та / або інструментів. Питання, які лежать в основі будь-якої плутанини і уникають зайвої складності конкретної програми, ще краще. Наприклад, ви можете запитати про просту структуру та / або про простий союз, а потім застосувати ці знання до своєї проблеми.
Thomas M. DuBuisson

2
@ ThomasM.DuBuisson Я думаю, ви зробите розумний пункт. Я буду трохи пропрацювати це.

@unsymbol у вас є відповідь на ваше запитання? Будь ласка, подумайте про додавання сюди :)
alfakini

1
Привіт несимвол, будь-які новини з цього приводу? Ви працювали і як?
Каспер Туле Хансен

Відповіді:


1

Як щодо цього: змінити код, щоб ви назвали членів. Макет у пам'яті такий самий, щоб він був бінарним сумісним. Ви повинні зробити цей патч для кожної версії 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;
    };
};
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.