プログラム

C++構造体配列の定義・初期化例

このページを見るとどうなるか

簡易テーブルみたいなのを扱えるようになれるはず。
やったね!

基本編

まえがき

簡単なデータをプログラム内に実装したいときがあると思う。

  • とはいっても、データーベースエンジンを導入するほどのデータを扱いたいわけではないし・・・。
  • とはいっても、二次元配列は、同じ型しか使えないし・・・。

そんなときは、構造体を定義して、それを配列にすることで、簡単なテーブルっぽい形のものが作れます。

本ページでは、そんな構造体配列の定義例や初期化例、あとは使用例を紹介していきたいと思います。

構造体配列の定義・初期化例

構造体定義

    typedef struct
    {
        int	iId;
        short	sType;
        short	sData;
    }ST_TTT;

初期化

const struct ST_TTT stList[] = {
    /* iId, sType, sData */
    { 1,   1,    123 },
    { 2,   5,    456 },
    { 3,   2,    789 },
    { -1,  -1,   -1 }
};

最終行を-1を設定しているのは、「ここが最終行だよ」という意味。

どう使うのか

定義・初期化ができたら、こんどは構造体配列「stList」をどう使えばよいのか使用例を紹介したいと思います。

構造体配列のインデックス位置取得

たとえば、メンバ変数「sType」の値と一致するインデックス位置(レコード位置)を取得する関数を用意します。

呼び側は、インデックス位置が取得できたら、そのレコードのデータ「sData」を参照することができるようになるといった使い方ができます。

// sTypeの値が一致するインデックス位置を取得する関数
int getIdx( short sType )
{
    int     iIdx;
    int     iRtn;

    iIdx = 0;
    iRtn = -1;

    // 終端まで、もしくは検出するまで検索
    while( stList[iIdx].sId != -1 )
    {
        // sType一致
        if( stList[iIdx].sType == sType )
        {
            iRtn = iIdx;
            // ループを抜ける
            break;
        }
        iIdx++;
    }

    return( iRtn );
}

呼び出し元

    int iIdx;
    int iRtn;

    // 一覧から検索
    iIdx = getIdx( sParam );
    if( iIdx != -1 )
    {
        // 一致した場合
        stList[iIdx].sData;    // 一致したインデックスのsDataを取得
    }
    else
    {
        // 存在しない
    }

この例でいうと、変数sParamを引数にgetIdx()関数でインデックス位置を取得してます。

インデックス位置を取得できたら、そのレコードのsDataを取得できます。

応用編

データ型を文字列に置きかえる

「sData」の部分も文字列にすると、名前テーブル(名前リストデータ)みたいな形のものにすることもできます。

そこから、文字Typeと一致するインデックスを取得し、そのレコードの文字列を取得する使い方も可能になります。

あとは、文字列と一致するデータを検索して、インデックス位置を取得する関数を作るのもよいかもしれません。

構造体に関数を追加

たとえば、インデックス位置が取得できて、関数を実行させる。といった使い方もできます。

ここまでくると、もうclassにしたら?と言われそうではありますが・・・。

構造体

    typedef struct
    {
        int	iId;
        short	sType;
        short	sData;
        int  (*pFunc)( short );    // 関数追加
    }ST_TTT;

初期化

int setData_sData( short );    // 関数宣言

const struct ST_TTT stList[] = {
    /* iId, sType, sData, pFunc() */
    { 1,   1,    123,    NULL },
    { 2,   5,    456,    setData_sData },    // 構造体配列に関数を定義
    { 3,   2,    789,    NULL },
    { -1,  -1,    -1,    NULL }
};

// 関数定義
int setData_sData( short )
{
    // 関数内の処理
}

呼び出し元

    int iIdx;
    int iRtn;

    // 一覧から検索
    iIdx = getIdx( sParam );
    if( iIdx != -1 )
    {
        // 処理が定義されている場合
        if( stList[iIdx].pFunc != NULL )
        {
            // 処理実行
            iRtn = stList[iIdx].pFunc( stList[iIdx].sData );
        }
    }
    else
    {
        // 存在しない
    }

この例でいうと、変数sParamを引数にgetIdx()関数でインデックス位置を取得してます。

次に、メンバ関数pFuncがNULLでない場合、関数を実行するという例になります。

構造体の値でいうと、メンバ変数sTypeが5の場合だけ、setData_sData()関数を呼ぶ形になるということになります。

以上です。参考になればと思います。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA