Interfacciamento con strutture e unioni anonime con c2hs


100

Come si potrebbe codificare questo pezzo di codice C in un file .chs in modo che c2hs possa trasformarlo in qualcosa di relativamente carino?

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
È più produttivo per te provare effettivamente a risolvere prima il problema, quindi porre domande specifiche sulla lingua e / o sugli strumenti. Le domande che vanno al centro di qualsiasi confusione ed evitano la complessità inutile di un'applicazione specifica, sono ancora migliori. Ad esempio, potresti chiedere informazioni su una struttura semplice e / o su una semplice unione, quindi applicare tale conoscenza al tuo problema.
Thomas M. DuBuisson

2
@ ThomasM.DuBuisson Penso che tu faccia un punto ragionevole. Lavorerò ancora un po 'su questo.

@unsymbol hai una risposta per la tua domanda? Si prega di considerare di aggiungerlo qui :)
alfakini

1
Ciao unsymbol, ci sono novità in merito? L'hai fatto funzionare e come?
Casper Thule Hansen

Risposte:


1

Che ne dici di questo: cambia il codice in modo da nominare i membri. Il layout in memoria è lo stesso in modo che sia compatibile con i binari. Dovresti fare questa patch per ogni versione della 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;
    };
};
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.