複雑なデータの取得 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 関数により、データが終わるまで、取得されることがわかるでしょうか。

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