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

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

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

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