Question

I installait une classe avec:

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

et mis en œuvre

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

Mais quand je fais cela, je reçois une erreur disant: « « float const * » à « const float » en initialisation ». Je comprends ce que l'erreur en disant, mais l'enfer est-il dire « float const » et comment mettre en œuvre mon tableau avec réparties les fonctions inline.

Était-ce utile?

La solution

Vous ne pouvez pas faire comme ça. Utilisez des 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),
};

Autres conseils

Votre retour de (float[]) {....} est pas légal, car le littéral composé va émettre un tableau automatique, et vous retournez un pointeur vers un tableau automatique qui est détruit si les feuilles de contrôle de flux cette fonction. Vous obtenez un pointeur ballants.

Il est également une caractéristique C99, de sorte que votre code est vraiment C ++ / C99:)


Le second problème que le compilateur détecte au moment de la compilation est l'initialisation du réseau. Ici, accolade élision applique. Parce qu'un const float* ne peut initialiser un const float[8], le compilateur suppose elision d'entretoise et tente d'initialiser le premier élément de array[0][0..7] utilisant ce const float*. Cela ne fonctionnera pas non plus et qui est réfléchie par le message d'erreur.

Vous allez devoir remplir ce tableau vous-même à l'exécution en utilisant une sorte de boucle ou vous allez devoir spécifier les valeurs initiales dans l'initialisation de tableau similaire à la façon dont vous le faites dans la déclaration de return.


Puisque vous utilisez C ++ et C99, pourquoi ne pas combiner les [boost|tr1]::array de puissance et de l'utilisation?

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

Attention que la sémantique de inline entre C ++ et C99 sont différentes. Mieux vaut être sûr de ce que la sémantique appliquer à votre programme.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top