您的位置:首页 > 编程语言 > Lua

call lua function from c and called back to c

2017-05-03 10:31 281 查看
Just a simple example:

--The c file:

#include <stdio.h>

#include "lua.h"

#include "luaconf.h"

#include "lualib.h"

#include "lauxlib.h"

#include "math.h"

static
int l_sin (lua_State *L) {

double d = lua_tonumber(L,
1); /* get argument */

lua_pushnumber(L, sin(d));
/* push result */

return
1;
/* number of results */

}

int main()

{

float pi =
3.1415926;

float pidiv6 = pi /
6;

float pidiv4 = pi /
4;

float rt =
0;

lua_State *L = luaL_newstate();

luaL_openlibs(L);

lua_pushcfunction(L, l_sin);
//Lua know the address of l_sin in c context

lua_setglobal(L,
"mysin");
//map l_sin to mysin will be called in lua context

if ( !luaL_dofile(L,
"./cal.lua") ) {

printf("load cal.lua successful\n");

}
else {

printf("error load file: %s\n", lua_tostring(L, -1));

return -1;

}

lua_getglobal(L,
"lsin");

lua_pushnumber(L, pidiv4);

if ( !lua_pcall(L,
1, 1,
0) ) {

rt = lua_tonumber(L, -1);

}
else {

printf("error : %s\n", lua_tostring(L, -1));

return -1;

}

printf("rt = %f\n", rt);

return
0;

}

--cal.lua
print("start...")

function lsin ( angle )

return mysin(angle)

end

print("end...")

==output==

start...

end...

load cal.lua successful

rt = 0.707107

//Actually a more simpler way is to call mysin directly without cal.lua

lua_getglobal(L, "mysin");

lua_pushnumber(L, pidiv4);

if ( !lua_pcall(L, 1, 1, 0)
) {

rt = lua_tonumber(L, -1);

} else {

printf("error : %s\n", lua_tostring(L, -1));

return -1;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: