Ваш возврат (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 различаются.Лучше быть уверенным, какая семантика применима к вашей программе.