Luaを使ってみた
Luaくらいは使えた方がよいかもしれないので、使ってみた。
CからLua関数の呼び出しとLuaからC関数の呼び出しをやってみた。
Luaで検索してヒットしたコードをパクりつつ。
準備が必要なことは
luaのインストール
VSの設定
・リンカの入力にある追加依存ファイルに「$(LUA_DEV)\lib\lua51.lib $(LUA_DEV)\lib\lua5.1.lib」を追加
・C/C++の全般にある追加インクルードに「$(LUA_DEV)\include」を追加
-- sample.lua -- Name = "abc" -- print("hello, " .. Name .. "!") -- sub in C print(sub(8,3)) function speech() print("test -> " .. Name .. "?") end function add(x, y) print("x : " .. x .. ", y : " .. y .. ".") return x+y end
#include "lua.hpp" // Luaで実行するC関数 static int sub(lua_State *Lua) { int n = lua_gettop(Lua); // 引数の数 lua_Number ret = lua_tonumber(Lua, 1)-lua_tonumber(Lua, 2); // 結果 lua_pushnumber(Lua, ret); // 戻り値の数 return 1; } int main() { int x = 1; int y = -10; lua_State *L = luaL_newstate(); luaL_openlibs(L); // C関数の登録 lua_register(L, "sub", &sub); int ret = luaL_loadfile(L, "D:\\Lua\\project\\sample.lua") || lua_pcall(L, 0, 0, 0); if(0 != ret) { perror(lua_tostring(L, -1)); } //--------------------------------- // C++からLua関数addを実行 // 引数:C++からLuaへ // 戻り値:LuaからC++へ // add関数をスタックに積む lua_getglobal(L, "add"); // 第1引数 lua_pushnumber(L, x); // 第2引数 lua_pushnumber(L, y); // add(x, y)を実行 // 引数2個,戻り値1個 if(0 != lua_pcall(L, 2, 1, 0)) { perror(lua_tostring(L,-1)); } if(lua_isnumber(L, -1)) { printf("result : %d\n", lua_tointeger(L,-1)); lua_pop(L,1); // 戻り値をpop } //--------------------------------- // C++からLua関数を実行 lua_getglobal(L, "speech"); if(lua_pcall(L, 0, 0, 0)) { perror(lua_tostring(L,-1)); } //--------------------------------- // C++からLua変数を取得 lua_getglobal(L, "Name"); ret = lua_isstring(L, -1); if(0 == ret) { printf("string is %s.\n", lua_tostring(L, -1)); } lua_close(L); return 0; }