【Lua C交互】2 - C调用lua模块

2 篇文章 0 订阅
lua和c有两种关系:

      一种是在lua中调用C的函数,C称为库代码,一种是C中调用lua,C就称为应用程序代码,此时C中包含了lua的解释器

   C代码部分

       注意在C++中,通常要把lua的一些头文件定义在extern “c”中,因为他们是C语言实现的。

    1. 作为应用程序调用lua代码:

char* buffer="print(\"hello,lua\")";
lua_State* ls=luaL_newstate();
int error;
luaL_openlibs(ls);
error=luaL_loadbuffer(ls,buffer,strlen(buffer),"line");
printError(ls,error,"loaderror");
error=lua_pcall(ls,0,0,0);
printError(ls,error,"callerror");

error=luaL_loadfile(ls,"1.lua");
printError(ls,error,"loaderror");
error=lua_pcall(ls,0,0,0);
printError(ls,error,"callerror");

lua_close(ls);
getchar();
return ;

所有lua相关的东西都保存在lua_State这个结构中,luaL_loadbuffer=luaL_loadfile加载lua代码,

lua_pcall安全的执行lua代码,他将lua代码在保护模式下运行,不会导致程序的crash,如果想保护与lua交互的c代码,则可以使用lua_cpcall,他接受的是一个c函数

     与lua代码间访问交换数据

      c和lua之间采用栈的方式交换数据。两边代码可以使用各种API将数据压入到一个公用的栈中,或者利用api从这个栈中取出数据。而事实是几乎所有的api函数都会使用这个栈。栈的空间是有限的,至少有20个。如果c代码作为一个库函数被lua调用,在可能出错的地方要调用lua_error,来保证在lua中执行时的安全。

另外这个栈不是一个全局的概念,每个函数都有自己的局部私有栈,当lua调用一个c函数时,第一个参数总是这个局部栈的索引1

    2 压入C元素到栈

    void pushnil/boolean/number/integer/string/lstring/...这些函数压入不同类型的数据到栈

   压入一个空表

lua_newtable

   设置栈中table的值:

   1.先压入索引key

  2.压入value

  3.调用lua_settable(Lua_state,index),设置index处的表的[key]=value,注意这个函数结束会弹出key和value

   3压入lua元素到栈

  lua_getglobal()将lua中的某个全局变量压入栈中

  4 从栈中获取lua元素

   int lua_toboolean(luaState *L,int index) 等函数

   栈的检索index正数开始代表从栈地开始的顺序,负数代表从栈顶的顺序

   可以先使用 lua_is*函数检测这个元素是不是所要类型或lua_type直接得到他的类型

  获取table元素:

  1.将元素的key压入到栈中 lua_pushstring

  2.使用lua_gettable(Lua_state,index)这里index是table的索引,这个函数可以获取这个table的索引为key的值,注意这个函数结束会弹出key并将value放于栈顶

*对于字符串索引,可以用lua_getfield(Lua_state,index,key)来直接获取

5从栈中获取元素设置给lua变量

lua_setglobal("L",name) 将栈顶元素给lua的name变量 ,然后弹出栈

6 其他栈操作

  lua_gettop得到栈中栈顶的位置,也就是数据的数量 lua_settop设置栈顶元素此外还有insert remove等在栈中间操作的各种操作

  7调用lua函数

  1.压入lua函数到栈lua_getglobal

  2.按参数从左到右顺序将c变量作为参数压入栈

3.使用lua_pcall调用lua_pcall(Lua_state,参数个数,返回值个数,错误处理函数索引),然后参数和函数被弹出,结果被先后压入栈

如果出错,lua_pcall将返回一个非零值,然后压入一条错误消息到栈

 

实例源码:

//mylua.c

#include        <stdio.h>
#include        "lua.h"
#include        "lualib.h"
#include        "lauxlib.h"

/*the lua interpreter*/
lua_State* L;
int luaadd(int x, int y)
{
        int sum;
/*the function name*/
        lua_getglobal(L,"add");
/*the first argument*/
        lua_pushnumber(L, x);
/*the second argument*/
        lua_pushnumber(L, y);
/*call the function with 2 arguments, return 1 result.*/
        lua_call(L, 2, 1);
/*get the result.*/
        sum = (int)lua_tonumber(L, -1);
/*cleanup the return*/
          lua_pop (L,1);
        return sum;
}

int luadel(int x, int y)
{
        int sum;
/*the function name*/
        lua_getglobal(L,"del");
/*the first argument*/
        lua_pushnumber(L, x);
/*the second argument*/
        lua_pushnumber(L, y);
/*call the function with 2 arguments, return 1 result.*/
        lua_call(L, 2, 1);
/*get the result.*/
        sum = (int)lua_tonumber(L, -1);
/*cleanup the return*/
          lua_pop (L,1);
        return sum;
}

int main(int argc, char *argv[])
{
        int sum=0;
/*initialize Lua*/
        L = luaL_newstate();
/*load Lua base libraries*/
        luaL_openlibs(L);
/*load the script*/
        luaL_dofile(L, "func.lua");
/*call the add function*/
        sum = luaadd(10, 15);
/*print the result*/
        printf("The add sum is %d \n",sum);
		
		sum = luadel(10, 15);
/*print the result*/
        printf("The del sum is %d \n",sum);
/*cleanup Lua*/
        lua_close(L);
        return 0;


}


 

模块:func.lua

-- func.lua
unction add(x,y)
       return x + y
end 

function del(x,y)
       return x - y
end 


 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值