0

私はクラスをセットアップします:

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」と言っていて、分解されたインライン関数で配列を実装する方法はありません。

4

2 に答える 2

2

(float[]) {....}複合リテラルは自動配列を発行し、制御フローがその関数を離れると破棄される自動配列へのポインターを返すため、を返すことは合法ではありません。ぶら下がっているポインターを取得します。

これは C99 の機能でもあるため、コードは実際には C++/C99 です :)


コンパイラがコンパイル時に検出する 2 番目の問題は、配列の初期化です。ここでは、ブレースの省略が適用されます。aは aconst 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),
}};

inlineC++ と C99のセマンティクスが異なることに注意してください。プログラムに適用されるセマンティクスを確認することをお勧めします。

于 2010-09-13T18:00:02.447 に答える
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),
};
于 2010-09-13T18:03:30.780 に答える