簡易テーブルみたいなのを扱えるようになれるはず。
やったね!
基本編
まえがき
簡単なデータをプログラム内に実装したいときがあると思う。
- とはいっても、データーベースエンジンを導入するほどのデータを扱いたいわけではないし・・・。
- とはいっても、二次元配列は、同じ型しか使えないし・・・。
そんなときは、構造体を定義して、それを配列にすることで、簡単なテーブルっぽい形のものが作れます。
本ページでは、そんな構造体配列の定義例や初期化例、あとは使用例を紹介していきたいと思います。
構造体配列の定義・初期化例
構造体定義
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()関数を呼ぶ形になるということになります。
以上です。参考になればと思います。