2

私は構造体が初めてで、少し苦労しています。私は次の構造体を持っています:

typedef struct 
{
    CHAR_t bWpId[10];
    CHAR_t bWpDescr[25];
    UINT16_t wCoA;
    sUtmCoordinate_t Coordinate;
} sWaypoint_t;

typedef struct
{
    sWaypointListElement Element[cMAX_WAYPOINTS];
    UINT8_t bHead;
    UINT8_t bTail;
    UINT8_t bNumElements;
} sWaypointList;

現在、各ウェイポイントは、構造体でもあるウェイポイントリストの要素です。

class CWaypointList
{
    private:
        sWaypointList WaypointList;
}

ここで私の質問は、アクセサーを記述せずに構造体の各要素の値を読み取るにはどうすればよいですか? アクセサーはプライベート構造体内のデータにアクセスする唯一の方法ですか?

このようにすると、次のエラーが表示されます:式は変更可能な値である必要があります。:

 element.bWpId = {'0','0','0','0','0','0','0','0','0','1'};
4

3 に答える 3

1

その構文を使用して、配列定義の外で配列を初期化することはできません。すべての値を手動で入力する必要があります。

幸いなことに、次のような、使用するための標準 C++ 関数がありますstd::fill

std::fill(std::begin(element.bWpId), std::end(element.bWpId), '0');
element.bWpId[9] = '1';

もちろん、sWaypoint_t構造体のコンストラクターを作成し、その中で配列を初期化できます。

typedef struct sWaypoint_s
{
    CHAR_t bWpId[10];
    CHAR_t bWpDescr[25];
    UINT16_t wCoA;
    sUtmCoordinate_t Coordinate;

    sWaypoint_s()
        : bWpId{'0','0','0','0','0','0','0','0','0','1'}
        {}
} sWaypoint_t;

これに関する問題は、C++11 対応のコンパイラが必要なことです。

于 2013-08-19T10:11:54.750 に答える
0

C++ では、既に構築されている配列をリスト初期化することはできません。リスト初期化構造体にも同じことが当てはまります。

使うstd::fillのもひとつの方法ですが、私はそのあいまいさが嫌いです。代わりに、次のヘルパー関数を使用してみてください。

template <class T, size_t Size>
void copy_array(T (&dst)[Size], const T (&src)[Size])
{
    std::copy(src, src+Size, dst);
}

これで、任意の配列を「割り当てる」ことができます。の場合element.bWpId

CHAR_t temp[] = {'0','0','0','0','0','0','0','0','0','1'};
copy_array(element.bWpId, temp);

この関数はコンパイル時に配列の型とサイズをチェックするので、ミスの可能性はありません。これは、明示的な std::fill および手動のインデックス作成よりも大きな利点です。

C++11 コンパイラにアクセスできない場合は、すべてです。持っている場合は、bWpIdtostd::array<Char_t, 10>を変更するだけで、いつでもリストを初期化できます。

于 2013-08-19T11:01:55.827 に答える