luaとC連携

luaのビルド(mingw + MSYSで)

Lua: download
MinGW - Minimalist GNU for Windows download | SourceForge.net
msys上でconfigure後、makeで簡単に出来た

cからluaを呼ぶテスト

http://someiyoshino.cool.ne.jp/insideyanesdk/wiki/wiki.cgi?page=Lua

  • cのソース
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

int main(int argc,char* argv[])
{
	lua_State *L=lua_open();
	lua_dofile(L,"test.lua");
	lua_getglobal(L,"foobar");
	lua_pushnumber(L,5);
	lua_pushnumber(L,7);
	lua_call(L,2,1);
	printf("%f\n",lua_tonumber(L,1));
	return 0;
}
all:
	gcc -IC:/lua-5.0.2/include -LC:/lua-5.0.2/lib luatest.c -llua -llualib
  • luaのソース
 function foobar(x,y)
     return x*y
 end

luaからcを呼ぶテスト

  • cのソース
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

// テスト関数
static int foo (lua_State *L) {
	int n = lua_gettop(L);               /* 引数の数 */
	lua_Number sum = 0;
	int i;
	for (i = 1; i <= n; i++) {
		if (!lua_isnumber(L, i)) {
			lua_pushstring(L, "関数`average´の引数が正しくない");
			lua_error(L);
		}
		sum += lua_tonumber(L, i);
	}
	lua_pushnumber(L, sum/n);        /* 最初の戻り値 */
	lua_pushnumber(L, sum);        /* 二番目の戻り値 */
	return 2;                          /* 戻り値の数 */
}

// 関数登録マクロ
#define lua_register(L,n,f) \
	(lua_pushstring(L, n), \
	 lua_pushcfunction(L, f), \
	 lua_settable(L, LUA_GLOBALSINDEX))

int main(int argc,char* argv[])
{
	lua_State *L=lua_open();
	luaopen_base(L);
	luaopen_string(L);
	luaopen_table(L);
	luaopen_math(L);
	luaopen_io(L);
	lua_register(L, "average", foo);
	lua_dofile(L,"test.lua");
	return 0;
}
all:
	gcc -IC:/lua-5.0.2/include -LC:/lua-5.0.2/lib luatest.c -llua -llualib
  • luaのソース
print(average(2, 4));