luaで、luaの関数を呼ぶC++の関数をluaから呼んでみた
試した環境は LuaJIT-2.0.0、Visual Studio 2008です。
lua側
print('callfunc:' ..
callfunc(
function(a, b)
print('Hello');
print('a=' .. a);
print('b=' .. b);
return a + b;
end
)
);
callfunc(
function(a, b)
print('Hello');
print('a=' .. a);
print('b=' .. b);
return a + b;
end
)
);
C++側
#include <cstdio>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
int l_callfunc(lua_State *L){
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushnumber(L, 5); // 第一引数
lua_pushnumber(L, 15); // 第二引数
lua_pcall(L, 2, 1, 0); // 引数2つ、戻り値1つとして積まれている関数を呼ぶ
double result = lua_tonumber(L, -1);
printf("result:%f\n", result);
lua_pop(L, 1);
lua_pushnumber(L, result * 2);
return 1; // 戻り値の数
}
int main(int argc, char *argv[]){
if (argc < 2) return 0;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "callfunc", l_callfunc);
if (luaL_loadfile(L, argv[1])){
printf("load失敗\n");
return 1;
}
if (lua_pcall(L, 0, 0, 0)){
printf("実行失敗\n");
return 1;
}else{
printf("最後の戻り値:%f\n", lua_tonumber(L, -1));
}
lua_close(L);
return 0;
}
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
int l_callfunc(lua_State *L){
luaL_checktype(L, -1, LUA_TFUNCTION);
lua_pushnumber(L, 5); // 第一引数
lua_pushnumber(L, 15); // 第二引数
lua_pcall(L, 2, 1, 0); // 引数2つ、戻り値1つとして積まれている関数を呼ぶ
double result = lua_tonumber(L, -1);
printf("result:%f\n", result);
lua_pop(L, 1);
lua_pushnumber(L, result * 2);
return 1; // 戻り値の数
}
int main(int argc, char *argv[]){
if (argc < 2) return 0;
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "callfunc", l_callfunc);
if (luaL_loadfile(L, argv[1])){
printf("load失敗\n");
return 1;
}
if (lua_pcall(L, 0, 0, 0)){
printf("実行失敗\n");
return 1;
}else{
printf("最後の戻り値:%f\n", lua_tonumber(L, -1));
}
lua_close(L);
return 0;
}
結果
Hello
a=5
b=15
result:20.000000
callfunc:40
最後の戻り値:0.000000
a=5
b=15
result:20.000000
callfunc:40
最後の戻り値:0.000000