Определение статического 2-мерного массива с помощью встроенной функции - PullRequest
0 голосов
/ 13 сентября 2010

Я установил класс с:

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

и реализовал

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

Но когда я делаю это, я получаю сообщение об ошибке "const float *" to "const float'в инициализации ".Я понимаю, что говорит ошибка, но, черт возьми, она говорит «const float» и как реализовать мой массив с разбитыми встроенными функциями.

Ответы [ 2 ]

2 голосов
/ 13 сентября 2010

Ваш возврат (float[]) {....} недопустим, потому что составной литерал будет выдавать автоматический массив, а вы возвращаете указатель на автоматический массив, который уничтожается, если поток управления покидает эту функцию.Вы получаете висячий указатель.

Это также функция C99, так что ваш код действительно C ++ / C99:)


Вторая проблема, которую компилятор обнаруживает во время компиляции, - это инициализация массива.Здесь применяется brace elision .Поскольку const float* не может инициализировать const float[8], компилятор принимает значение скобки и пытается инициализировать первый член array[0][0..7], используя этот const float*.Это также не будет работать, и это отражено в сообщении об ошибке.

Вы должны будете самостоятельно заполнить этот массив во время выполнения, используя какой-то цикл, или вам придется указать начальные значения в инициализации массива, аналогично тому, как вы это делаете в операторе return,


Поскольку вы используете C ++ и C99, почему бы не объединить мощность и не использовать [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),
}};

Остерегайтесь семантики inlineмежду C ++ и C99 различаются.Лучше быть уверенным, какая семантика применима к вашей программе.

1 голос
/ 13 сентября 2010

Так делать нельзя.Использовать макросы:

#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),
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...