インライン関数を備えた静的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です:)
コンパイラがコンパイル時に検出する2番目の問題は、配列の初期化です。ここ、 ブレースエリジョン 適用されます。 a 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の間のセマンティクスは異なります。プログラムにどのセマンティクスが適用されるかを確認してください。