lua与C(一):C调用lua

      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变量 ,然后弹出栈

其他栈操作

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

 

  7调用lua函数

  1.压入lua函数到栈lua_getglobal

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

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

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

 

 

 

 

 

 

  

     

 

 

 

  

上一篇:《51单片机应用开发范例大全(第3版)》——1.3 C51基础知识


下一篇:数言Digitale想用大数据,为酒店做预测分析