LuaとC/C++のデータの受け渡しは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); }
※このコードを実行するとセキュリティソフトにウィルス認定されるんだが、ヒューリスティックスキャンが誤爆でもしているのか?
#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); }
#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); }