我设置了一个类:
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'以及如何使用细分的内联函数实现我的数组。
答案 0 :(得分:2)
返回(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),
}};
请注意C ++和C99之间的inline
语义不同。更好的确保语义适用于您的程序。
答案 1 :(得分:1)
你不能这样做。使用宏:
#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),
};