Pregunta

I fijó una clase con:

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

e implementado

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

Pero cuando hago esto me sale un error diciendo " 'float const *' a 'float const' en la inicialización". Entiendo lo que dice el error, pero diablos está diciendo que 'float const' y cómo se puede poner en práctica mi matriz con desglosado funciones en línea.

¿Fue útil?

Solución

No se puede hacer así. Use macros:

#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),
};

Otros consejos

Su devolución de (float[]) {....} no es legal, porque el literal compuesto se va a emitir una serie automática, y devuelve un puntero a una matriz automática que se destruye si las hojas de control de flujo de esa función. Se obtiene un puntero colgando.

Es también una característica C99, por lo que su código es realmente C ++ / C99:)


El segundo problema que el compilador detecta en tiempo de compilación es la inicialización de la matriz. Aquí, corsé elisión se aplica. Debido a que un const float* no puede inicializar un const float[8], el compilador utiliza elisión corsé y trata de inicializar el primer miembro de array[0][0..7] usando ese const float*. Esto no va a funcionar bien y que se refleja en el mensaje de error.

Usted va a tener que llenar esa matriz ti mismo en tiempo de ejecución utilizando algún tipo de bucle o que van a tener que especificar los valores iniciales en la inicialización de la matriz similar a como lo hace en la declaración return.


Desde que está utilizando C ++ y C99, por qué no combinar la potencia y el 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),
}};

Ten en cuenta que la semántica inline entre C ++ y C99 difieren. Mejor estar seguro de lo que aplican la semántica de su programa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top