Определение статического 2-мерного массива с встроенной функцией
-
02-10-2019 - |
Вопрос
Я настраиваю класс с:
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*», чтобы «const float» в инициализации ». Я понимаю, о чем говорит ошибка, но, черт возьми, это говорит «const float» и как реализовать мой массив с помощью сломанных встроенных функций.
Решение
Ты не можешь этого делать. Используйте макросы:
#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),
};
Другие советы
Ваше возвращение (float[]) {....}
не является законным, потому что соединительный литерал испускает автоматический массив, и вы возвращаете указатель на автоматический массив, который разрушается, если поток управления оставляет функционирование. Вы получаете свисающий указатель.
Это также функция C99, так что ваш код действительно C ++/C99 :)
Вторая проблема, которую компилятор обнаруживает во время компиляции, - это инициализация массива. Здесь, скоба Элизию применяется. Потому что а 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 отличается. Лучше будьте уверены, что семантика применима к вашей программе.