複雑なデータの取得 2

概要

(※この章は、Lua版のココと対応しています。)

データを取り込み用関数を登録して、複雑なデータに対処する

mrubyに記述しているテーブルデータを、ScenarioMod側へと読み込んでみましょう。

ScenarioModでは、mrb_state* 型のmrbというグローバル変数がすでに登録されています。
又、mrubyに最初から付属しているヘッダーファイルは、ほぼ全て読み込まれていますので、
mrubyの様々なWeb上の情報をそのまま利用しやすいでしょう。

以下のように対象となるtxtファイルを「天翔記フォルダ」に用意します。

(BushouData.txt)側
data_list = [
    {'名前'=>"武田信玄" , '政治'=>100, '戦闘'=> 90, '智謀'=>80},
    {'名前'=>"上杉謙信" , '政治'=>70,  '戦闘'=>120, '智謀'=>70},
    {'名前'=>"北条氏康" , '政治'=>105, '戦闘'=> 80, '智謀'=>90},
]

for data in data_list do
    ImportBushouData( data['名前'], data['政治'], data['戦闘'], data['智謀'] )
end

この取り込み用の「ImportBushouData」という関数をScenarioModに用意してやれば良いのです。

(カスタム駆動関数.cpp)

struct myパラメタ型 {
  string 名前;
  int 政治;
  int 戦闘;
  int 智謀;
};
vector<myパラメタ型> vBushouDataList;



// ImportBushouData に相当する関数。1人分のデータを受け取って、そのままC++内の配列へと付け足す。
static mrb_value mrb_ImportBushouData(mrb_state *mrb, mrb_value self) {

  myパラメタ型 data;

  mrb_value 名前;
  mrb_int 政治;
  mrb_int 戦闘;
  mrb_int 智謀;

  mrb_get_args(mrb, "Siii", &名前, &政治, &戦闘, &智謀); // S=String, i=整数 f=浮動小数

  data.名前 = RSTRING_PTR(名前); // RObjectという共用の型をchar*と見なして~
  data.政治 = 政治;
  data.戦闘 = 戦闘;
  data.智謀 = 智謀;


  // C++内のリスト変数にdata追加
  vBushouDataList.push_back(data);

  // selfを返す。
  return self;
}



void カスタム::On_起動時() {
  struct RClass *krnm;
  krnm = mrb->kernel_module; /* ココ2行は関数を特定のクラス内ではなく、グローバルに登録するため。*/

  mrb_define_method(mrb, krnm, "ImportBushouData", mrb_ImportBushouData, MRB_ARGS_REQ(4)); // 関数登録。引数4つだよ

  try {
    MRUBY::Do_ファイル("BushouData.txt");
  }
  catch (...) {}

  for each(myパラメタ型 data in vBushouDataList) {
    デバッグ出力 << data.名前 << endl;
    デバッグ出力 << data.政治 << endl;
    デバッグ出力 << data.戦闘 << endl;
    デバッグ出力 << data.智謀 << endl;
    デバッグ出力 << string(20, '-') << endl;
  }
}

というように、比較的簡潔なプログラムとなりました。

ファイルを読み込むよりも先に「ImportBushouData」という関数をmrbへと登録します。
そして、ファイルを読み込み、実行すれば、forループと、ImportBushouData 関数により、データが終わるまで、取得されることがわかるでしょうか。

このように独自の関数を登録を上手く利用すれば、プログラムの見通しをよくすることが可能となります。