Domanda

ha installato una classe con:

class Example {
    static const float array[3][8];
};

e implementato

inline const float below_center(const float pos) {
    return pos - (size / 2); // size is a const float
}

inline const float above_center(const float pos) {
    return pos + (size / 2);
}

inline const float *set_pos(const float x, const float y) {
    return (float []) {
        below_center(x), below_center(y),
        below_center(x), above_center(y),
        above_center(x), below_center(y),
        above_center(x), above_center(y),
    };
}

const float Example::array[3][8] = {
    set_pos(2.0f, 0.0f),
    set_pos(-1.0f, -1.0f),
    set_pos(1.0f, -1.0f),
};

Ma quando faccio questo ottengo un errore dicendo: " 'float const *' a 'float const' in inizializzazione". Capisco quello che dice l'errore, ma il diavolo sta dicendo 'float const' e come può implementare il mio array con ripartito le funzioni inline.

È stato utile?

Soluzione

Non si può fare così. Utilizzare le macro:

#define BELOW_CENTER(pos) ((pos) - (size / 2))
#define ABOVE_CENTER(pos) ((pos) + (size / 2))

#define SET_POS(x, y) {               \
    BELOW_CENTER(x), BELOW_CENTER(y), \
    BELOW_CENTER(x), ABOVE_CENTER(y), \
    ABOVE_CENTER(x), BELOW_CENTER(y), \
    ABOVE_CENTER(x), ABOVE_CENTER(y)  \
}

const float Example::array[3][8] = {
    SET_POS(2.0f, 0.0f),
    SET_POS(-1.0f, -1.0f),
    SET_POS(1.0f, -1.0f),
};

Altri suggerimenti

Il ritorno di (float[]) {....} non è legale, perché il letterale composto sta per emettere un allineamento automatico, e si restituisce un puntatore ad un array automatica che viene distrutto se i fogli di flusso di controllo che funzioni. Si ottiene un puntatore penzoloni.

E 'anche una funzione di C99, in modo che il codice è davvero C ++ / C99:)


Il secondo problema che il compilatore rileva in fase di compilazione è l'inizializzazione dell'array. Qui, brace elisione si applica. Poiché un const float* non può inizializzare un const float[8], il compilatore assume tutore elisione e tenta di inizializzare il primo elemento di array[0][0..7] utilizzando tale const float*. Questo non funziona nemmeno e che si riflette dal messaggio di errore.

Si stanno per avere a riempire tale matrice te stesso in fase di esecuzione utilizzando una sorta di loop o si sta andando ad avere per specificare i valori iniziali nella inizializzazione di matrice simile a come lo si fa nella dichiarazione return.


Dal momento che si sta utilizzando C ++ e C99, perché non combinare la potenza e l'uso [boost|tr1]::array?

inline const boost::array<float, 8> set_pos(const float x, const float y) {
    return (boost::array<float, 8>) {{
        below_center(x), below_center(y),
        below_center(x), above_center(y),
        above_center(x), below_center(y),
        above_center(x), above_center(y),
    }};
}

const boost::array<boost::array<float, 8>, 3> Example::array = {{
    set_pos(2.0f, 0.0f),
    set_pos(-1.0f, -1.0f),
    set_pos(1.0f, -1.0f),
}};

Attenzione che la semantica inline tra C ++ e C99 differiscono. Meglio essere sicuro di quello che la semantica si applicano al vostro programma.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top