bate's blog

調べたこと実装したことなどを取りとめもなく書きます。

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;
}