Frage

ich ein Setup-Klasse mit:

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

und umgesetzt

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

Aber wenn ich dies tun, bekomme ich eine Fehlermeldung, dass „‚const float *‘auf‚const float‘in der Initialisierung“. Ich verstehe, was der Fehler sagen, aber zum Teufel es sagt ‚const float‘ und wie kann meinen Array implementieren mit nach unten Inline-Funktionen gebrochen.

War es hilfreich?

Lösung

Sie können wie das nicht tun. Verwenden von Makros:

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

Andere Tipps

Sie von (float[]) {....} Rückkehr ist nicht legal, weil die Verbindung wörtlichen eine automatische Anordnung emittieren wird, und Sie werden einen Zeiger auf eine automatische Anordnung zurückkehren, die, wenn Steuerfluss verläßt die Funktion zerstört wird. Sie erhalten einen baumelnden Zeiger.

Es ist auch eine C99-Funktion, so dass Ihr Code wirklich ist C ++ / C99:)


Das zweite Problem, dass der Compiler bei der Kompilierung erkennt ist die Array-Initialisierung. Hier Klammer elision gilt. Da ein const float* kann keine const float[8] initialisieren, nimmt der Compiler Verstrebung elision und versucht, das erste Mitglied der array[0][0..7] zu initialisieren, die const float* verwenden. Das wird nicht funktionieren entweder, und dass durch die Fehlermeldung wider.

Sie gehen zu müssen, dass Array füllen sich während der Laufzeit eine Art Schleife oder Sie gehen, um die ursprünglichen Werte im Array Initialisierung angeben müssen ähnlich, wie man es in der return Anweisung tun.


Da Sie mit C ++ und C99, warum nicht die Kraft und die Verwendung [boost|tr1]::array kombinieren?

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

Beachten Sie, dass die inline Semantik zwischen C ++ und C99 unterscheiden. Besser sicher sein, was Semantik zu Ihrem Programm anwenden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top