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

来源:互联网 发布:录音软件下载 编辑:程序博客网 时间:2024/04/29 16:44
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.luaunction add(x,y)       return x + yend function del(x,y)       return x - yend 


 

 

0 0
原创粉丝点击