スポンサーリンク

C++にLuaを組み込む(1)C++からスクリプト実行/スクリプトからC++の関数実行

LuaはC言語に組み込みやすい言語。

Windows版をmakeするのは面倒なので、ビルド済みバイナリをダウンロードする。

以下URLへ行き、Historyから Release 1とついているものをダウンロードする。

https://luabinaries.sourceforge.net

例1 与えた文字列をスクリプトとして実行

#include <lua.hpp>

// lua54.dllが必要
#pragma comment(lib, "lua54.lib")

int main()
{
    lua_State* luas = luaL_newstate();

    // Luaの標準ライブラリを読み込む
    luaL_openlibs(luas);

// Luaスクリプト const char* script = R"(
for i = 1,5 do
  print(i)
end
)";

    // 文字列で与えてスクリプトを実行する
    luaL_dostring(luas, script);
    
    // Luaの終了。全てのメモリ解放
    lua_close(luas);

}
1
2
3
4
5

例2 ファイル名を与えて実行

myscript.lua

for i = 1,5 do
  print(i)
end

呼び出し側

#include <iostream>

#include <lua.hpp>

// lua54.dllが必要
#pragma comment(lib, "lua54.lib")

int main()
{
    lua_State* luas = luaL_newstate();

    // Luaの標準ライブラリを読み込む
    luaL_openlibs(luas);

    // myscript.luaを実行する
    // luaL_dofileでもいい。luaL_dofileはマクロ。
    // luaL_dofile(luas, "myscript.lua");

    luaL_loadfile(luas, "myscript.lua");// スクリプトファイル読み込み
    lua_pcall(luas, 0, LUA_MULTRET, 0);// スクリプト実行
    
    // Luaの終了。全てのメモリ解放
    lua_close(luas);

}
1
2
3
4
5

例3 C++からLuaの関数を呼び出す

#include <lua.hpp>

// lua54.dllが必要
#pragma comment(lib, "lua54.lib")

int main()
{
    lua_State* luas = luaL_newstate();

    // Luaの標準ライブラリを読み込む
    luaL_openlibs(luas);

    luaL_dostring(luas,
R"(
function calc(x, y)
  return 
    x + y,
    x - y,
    x * y,
    x / y
end
)"
);

    // Luaの関数を呼び出す
    // 引数はスタックにプッシュして渡す
    /////////////////////////////////////////////
    lua_getglobal(luas, "calc"); // add 関数をスタックにプッシュ
    lua_pushnumber(luas, 3); // 第一引数 x に 3 をプッシュ
    lua_pushnumber(luas, 7); // 第二引数 y に 7 をプッシュ
    /////////////////////////////////////////////
    // 関数呼び出し
    int ret = lua_pcall(
        luas,
        2, // 引数の数
        4, // 戻り値の数
        0  // エラーハンドラのインデックス
    );
    /////////////////////////////////////////////
    // エラーチェック
    if (ret != LUA_OK) {
        const char* err = lua_tostring(luas, -1);
        printf("error: %s\n", err);
        return -1;
    }
    /////////////////////////////////////////////
    // 戻り値を取得
    int add = (int)lua_tonumber(luas, -4);// 戻り値1
    int sub = (int)lua_tonumber(luas, -3);// 戻り値
    double mul = (double)lua_tonumber(luas, -2);// 戻り値
    double div = (double)lua_tonumber(luas, -1);// 戻り値
    printf("add = %d\n", add);
    printf("sub = %d\n", sub);
    printf("mul = %f\n", mul);
    printf("div = %f\n", div);
    /////////////////////////////////////////////
    
    // Luaの終了。全てのメモリ解放
    lua_close(luas);

}
add = 10
sub = -4
mul = 21.000000
div = 0.428571

例4 LuaからC++の関数を呼び出す

#include <lua.hpp>

// lua54.dllが必要
#pragma comment(lib, "lua54.lib")

int ccalc(lua_State* L) {
    double a = luaL_checknumber(L, 1); // 1番目の引数を取得
    double b = luaL_checknumber(L, 2); // 2番目の引数を取得

    // 結果をスタックにプッシュ
    lua_pushnumber(L, a + b);
    lua_pushnumber(L, a - b);
    lua_pushnumber(L, a * b);
    lua_pushnumber(L, a / b);
    return 4; // 戻り値の数を返す
}
int main()
{
    lua_State* luas = luaL_newstate();

    // Luaの標準ライブラリを読み込む
    luaL_openlibs(luas);

    // C++の関数をLuaに登録
    lua_register(luas, "ccalc", ccalc);

    // LuaからC++の関数を呼び出す
    luaL_dostring(luas,
R"(
add,sub,mul,div = ccalc(3, 7)
print("add",add)
print("sub",sub)
print("sub",mul)
print("div",div)
)"
);

    // Luaの終了。全てのメモリ解放
    lua_close(luas);

}
add 10.0
sub -4.0
sub 21.0
div 0.42857142857143

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)


この記事のトラックバックURL: