#include <iostream>
#include <math.h>
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
};
void printStackSize(lua_State* L)
{
int nele = lua_gettop(L);
std::cout << std::endl << "=====";
std::cout << nele << "=====" << std::endl;
}
//lua 调 c
int c_fun_average(lua_State* L)
{
int n = lua_gettop(L);
double sum = 0.f;
for (int i = 1; i <= n; i++)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "incorrect argument to 'average'");
lua_error(L);
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum / n);
lua_pushnumber(L, sum);
return 2;
}
void luaCallC()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);//加载所有lua库
lua_register(L, "lu_average", c_fun_average);
luaL_dofile(L, "test0.lua");
lua_close(L);
}
//c 调 lua
void cCallLua()
{
lua_State* L = luaL_newstate();
luaopen_base(L); //加载部分lua库
luaopen_table(L);
luaopen_io(L);
luaopen_string(L);
luaopen_math(L);
luaL_dofile(L, "D:\\myprograms\\lua_test\\test0.lua");
lua_getglobal(L, "func_c_lua");
lua_pushnumber(L, 1);
lua_pushnumber(L, 2);
lua_pcall(L, 2, 2, 0);
int result_sum = lua_tointeger(L, -1);
lua_pop(L, 1);
int result_avg = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_close(L);
}
int main()
{
//c调lua, lua调lua, lua调c
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "lu_average", c_fun_average);
luaL_dofile(L, "D:\\myprograms\\lua_test\\test0.lua");
lua_getglobal(L, "func_c_lua");
lua_pushnumber(L, 1);
lua_pushnumber(L, 2);
lua_pcall(L, 2, 2, 0);
int result_sum = lua_tointeger(L, -1);
lua_pop(L, 1);
int result_avg = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_close(L);
std::cout << "sum = " << result_sum << " avg = " << result_avg << std::endl;
return 0;
#include <math.h>
extern "C"
{
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
};
void printStackSize(lua_State* L)
{
int nele = lua_gettop(L);
std::cout << std::endl << "=====";
std::cout << nele << "=====" << std::endl;
}
//lua 调 c
int c_fun_average(lua_State* L)
{
int n = lua_gettop(L);
double sum = 0.f;
for (int i = 1; i <= n; i++)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "incorrect argument to 'average'");
lua_error(L);
}
sum += lua_tonumber(L, i);
}
lua_pushnumber(L, sum / n);
lua_pushnumber(L, sum);
return 2;
}
void luaCallC()
{
lua_State* L = luaL_newstate();
luaL_openlibs(L);//加载所有lua库
lua_register(L, "lu_average", c_fun_average);
luaL_dofile(L, "test0.lua");
lua_close(L);
}
//c 调 lua
void cCallLua()
{
lua_State* L = luaL_newstate();
luaopen_base(L); //加载部分lua库
luaopen_table(L);
luaopen_io(L);
luaopen_string(L);
luaopen_math(L);
luaL_dofile(L, "D:\\myprograms\\lua_test\\test0.lua");
lua_getglobal(L, "func_c_lua");
lua_pushnumber(L, 1);
lua_pushnumber(L, 2);
lua_pcall(L, 2, 2, 0);
int result_sum = lua_tointeger(L, -1);
lua_pop(L, 1);
int result_avg = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_close(L);
}
int main()
{
//c调lua, lua调lua, lua调c
lua_State* L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "lu_average", c_fun_average);
luaL_dofile(L, "D:\\myprograms\\lua_test\\test0.lua");
lua_getglobal(L, "func_c_lua");
lua_pushnumber(L, 1);
lua_pushnumber(L, 2);
lua_pcall(L, 2, 2, 0);
int result_sum = lua_tointeger(L, -1);
lua_pop(L, 1);
int result_avg = lua_tointeger(L, -1);
lua_pop(L, 1);
lua_close(L);
std::cout << "sum = " << result_sum << " avg = " << result_avg << std::endl;
return 0;
}
===================================
test0.lua
===================================
function fun_lua_c(a, b)
print("call myfunc...")
print(a, b)
avg, sum = lu_average(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
return avg, sum
end
function func_c_lua(a, b)
return fun_lua_c(a, b)
end