スポンサーリンク

C++にLuaを組み込む(2)C++とLuaで変数の受け渡しを行う

LuaとC/C++のデータの受け渡しはLuaのスタックを介して行う。

例1 Lua側で ... でスタックから値取り出し

#include <lua.hpp>

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


int main()
{

    lua_State* luas = luaL_newstate();

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

// lua_pcallで呼び出す。 スタックに積まれた変数を取り出すには ... を使用 luaL_loadstring(luas, R"(
        local val1,val2 = ...;
        print("Received value:", val1,val2);
)");

lua_pushinteger(luas, 10); // 値をスタックに積む lua_pushstring(luas, u8"Hello World"); // 値をスタックに積む。文字列はUTF-8で渡す
lua_pcall(luas, 2, 0, 0); // Luaの終了。全てのメモリ解放 lua_close(luas); }
Received value: 10 Hello World

※このコードを実行するとセキュリティソフトにウィルス認定されるんだが、ヒューリスティックスキャンが誤爆でもしているのか?

例2 グローバル変数へ値を設定

#include <lua.hpp>

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


int main()
{

    lua_State* luas = luaL_newstate();

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

    // Luaスクリプト
    // luaL_loadstringによりコンパイルされる
    int load_status = luaL_loadstring(luas, R"(
      function myfunc()
        print(my_string);
        print(my_int);
      end
)");

    if (load_status == LUA_OK) {
        // Luaスクリプトを実行
        // スクリプトを実行しているだけなので関数を実行しているわけではない
        // このスクリプト実行で myfunc()が定義される。
        lua_pcall(luas, 0, 0, 0);
    }

    lua_pushinteger(luas, 10);           // 値をPushする
    lua_setglobal(luas, "my_int");       // グローバル変数を定義し、値をセット

    lua_pushstring(luas, "Hello World"); // 値をPushする
    lua_setglobal(luas, "my_string");    // グローバル変数を定義し、値をセット

    // 一回目の lua_pcall で定義した myfunc() をスタックへPushする
    lua_getglobal(luas, "myfunc");    
    lua_pcall(luas, 0, 0, 0);// myfunc呼び出し

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

}
Hello World
10

例3 グローバル変数から値を取得

#include <lua.hpp>

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


int main()
{

    lua_State* luas = luaL_newstate();

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

    // lua_pcallでコンパイル
    luaL_loadstring(luas, R"(
global_value = 105
)");

    // Luaスクリプトを実行
    lua_pcall(luas, 0, 0, 0);

    lua_getglobal(luas, "global_value");
    int gval = lua_tointeger(luas, -1);
    printf("global_value = %d\n", gval);


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

}
global_value = 105

コメントを残す

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

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


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