本文通过程序实例说明C调用lua脚本和lua调用C的方法:
先建立一个 test.c文件:
#include <stdio.h>
#include <stdlib.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
#pragma comment(lib, "lua5.1.lib")
// lua解释器指针
lua_State* L;
#if 0
// C执行lua脚本
/************************************************************************
1、lua_open()返回一个指向Lua解释器的一个指针。
2、luaL_openlibs()用于装载Lua库,它提供了一些简单的函数,如:print。
3、通过调用luaL_dofile()执行脚本。它的作用是读取并解释脚本。
4、最后,通过lua_close()函数关闭Lua。
************************************************************************/
int main(int argc, char **argv)
{
L = lua_open();// 打开lua
luaL_openlibs(L);// 打开lua库
luaL_dofile(L, "test.lua");// 执行lua脚本
lua_close(L);// 关闭lua
return 0;
}
#endif
#if 0
// C 调用Lua函数
/************************************************************************
1、调用lua_getglobal()将average()函数压入栈中。
2、调用lua_pushnumber()将第一个参数x压入栈中。
3、同样,调用lua_pushnumber()将第二个参数y压入栈中。
4、调用lua_call(),其参数的意思是两个参数,一个返回值。
5、现在,我们可以利用lua_tointeger()获得整型返回值。
6、最后,调用lua_pop()将值从栈中移出。
************************************************************************/
int lua_average(int arr[],int a)
{
int sum;
int data;
int i =0;
lua_getglobal(L, "average");// 根据函数名获得Lua中的函数
for (i;i<a;i++)
lua_pushnumber(L, arr[i]);// 参数一入栈
lua_pushnumber(L, a);//注意数组要传送一个长度的一个隐含参数
lua_call(L, a+1, 1);// 调用lua中的add函数,连个输入参数,一个返回值
sum = (int)lua_tointeger(L, -1);//获得返回值
lua_pop(L, 1);// 将返回值出栈,恢复栈中的元素
return sum;
}
int main(int argc, char **argv)
{
int sum;
int arr[]={1,2,3,4,5,6,7,8,9};
L = lua_open();// 打开lua
luaL_openlibs(L);// 打开lua库
luaL_dofile(L, "test.lua");// 加载lua脚本
sum = lua_average(arr,9);// 调用lua中的函数
printf("Result is: %d.\n", sum);
lua_close(L);// 关闭lua
return 0;
}
#endif
#if 1
// lua调用C的函数
/************************************************************************
1、lua_gettop函数返回栈顶的索引值。因为在Lua中栈是从1开始编号的,因此该函
数获得的值就是参数的个数。
2、在for循环中计算所有参数之和。
3、调用lua_pushnumber()将参数的平均值压栈。
4、将参数之和压入栈中。
5、最后,函数返回2,说明有两个返回值在栈中。
************************************************************************/
static int average(lua_State *L)
{
int n = lua_gettop(L);// 取得栈顶的元素参数个数
double sum = 0;
int i;
// 循环求取参数的和
for (i = 1; i <= n; i++)
{
if (!lua_isnumber(L, i))
{
lua_pushstring(L, "Incorrect argument to 'average'");
lua_error(L);
}
else
{
sum += lua_tonumber(L, i);
}
}
lua_pushnumber(L, sum/n);// 将平均数压入栈顶
lua_pushnumber(L, sum);// 将和压入栈中
return 2;// 返回压入栈中参数的个数
}
int main(int argc, char **argv)
{
int sum;
L = lua_open();// 打开lua
luaL_openlibs(L);// 打开lua库
lua_register(L, "average", average);// 注册lua基本库,绑定之
luaL_dofile(L, "test.lua");// 加载lua脚本
lua_close(L);// 关闭lua
system("pause");
return 0;
}
#endif
然后建立一个lua文件test.lua
--C dofile
print ("hello world");
--Be called by C
function add(x, y)
return x - y;
end
--Be called by C
function lua_average(...)
local sum = 0;
for i,j in pairs(arg) do
sum = sum + j;
end
return sum/table.getn(arg);
end
--call C function
avg, sum = average(23,56,46,24,65,75,34,12);
print("The average is : ", avg);
print("The sum is : ", sum);