複雑なデータの取り扱い 改良版

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

以前、Lua側で複雑な入り組んだデータを定義し、これをScenarioModで取得しました。
データの取り込みには成功しましたが、それでも若干見通しが悪いプログラムとなっていました。

しかし、「データ取り込み用」の独自の関数をLuaへと提供できるのであれば、
これを大幅に簡略化できます。

  • BushouData.txt

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

    
    local data_list = {
      {['名前']="武田信玄" , ['政治']=100, ['戦闘']= 90, ['智謀']=80},
      {['名前']="上杉謙信" , ['政治']=70,  ['戦闘']=120, ['智謀']=70},
      {['名前']="北条氏康" , ['政治']=105, ['戦闘']= 80, ['智謀']=90},
    }
    
    for i, data in ipairs(data_list) do
      ImportBushouData( i, data['名前'], data['政治'], data['戦闘'], data['智謀'] )
    end
    
    

    この取り込み用の「ImportBushouData」という関数をScenarioModに用意してやれば良いのです。
    そうすれば、以前とは比べ物にならないほど、簡潔で見通しの良いプログラムが可能となります。

  • カスタム駆動関数.cpp

    
    struct myパラメタ型 {
      int 番号;
      string 名前;
      int 政治;
      int 戦闘;
      int 智謀;
    };
    
    vector<myパラメタ型> vBushouDataList;
    
    // ImportBushouData に相当する関数。1人分のデータを受け取って、そのままC++内の配列へと付け足す。
    int Lua_ImportBushouData(lua_State *L) {
    
      myパラメタ型 data;
    
      // 1番目の引数が実数形式であれば…
      if ( lua_isnumber(L, 1) ) {
        data.番号 = lua_tointeger(L, 1);
      }
      // 2番目の引数が文字列形式であれば…
      if ( lua_isstring(L, 2) ) {
        data.名前 = lua_tostring(L, 2);
      }
      // 3番目の引数が実数形式であれば…
      if ( lua_isnumber(L, 3) ) {
        data.政治 = lua_tointeger(L, 3);
      }
      // 4番目の引数が実数形式であれば…
      if ( lua_isnumber(L, 4) ) {
        data.戦闘 = lua_tointeger(L, 4);
      }
      // 5番目の引数が実数形式であれば…
      if ( lua_isnumber(L, 5) ) {
        data.智謀 = lua_tointeger(L, 5);
      }
    
      // C++内のリスト変数にdata追加
      vBushouDataList.push_back(data);
    
      // Lという画用紙に最後に書いた引数群を削除
      lua_pop(L, lua_gettop(L));
    
      // この関数が呼ばれた際に返す返り値の個数を返す
      return 0;
    }
    
    void カスタム::On_起動時() {
    
      try {
        // Lua_ImportBushouData関数 を  ImportBushouData という名前でLの画用紙に登録
        lua_register(L, "ImportBushouData", &Lua_ImportBushouData);
    
        // ファイルを読み込んで実行
        LUA::Do_ファイル("BushouData.txt");
    
      } catch(...) { }
    
      for each(myパラメタ型 data in vBushouDataList) {
        デバッグ出力 << data.番号 << endl;
        デバッグ出力 << data.名前 << endl;
        デバッグ出力 << data.政治 << endl;
        デバッグ出力 << data.戦闘 << endl;
        デバッグ出力 << data.智謀 << endl;
        デバッグ出力 << string(20, '-') << endl;
      }
    }
    

    というように、非常に見通しが良いプログラムとなりました。

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

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