码迷,mamicode.com
首页 > Windows程序 > 详细

Lua_CAPI(1)

时间:2015-08-07 20:11:29      阅读:210      评论:0      收藏:0      [点我收藏+]

标签:

LUA_C_API
如何使用CAPI存取操作Lua中的值,一组能使C与Lua交互的函数


Lua_C数据交互使用一个虚拟栈:luaState
Lua和C的差异:1、Lua使用垃圾回收,C使用显式的内存释放
 2、Lua使用动态类型,C使用静态类型


lua头文件介绍:
lua.h定义了lua提供的基础函数,包括创建Lua环境(LuaState),调用Lua函数(lua_pcall)...
lauxlib.h定义了辅助库提供的函数,以luaL_开头


构建Lua环境执行Lua代码的简单例子:
<span style="font-size:14px;">#include <stdio.h>
#include <string.h>
extern "C" {  
#include "lua.h"
#include "lauxlib.h"
#include "lualib.h"
} 




int main(void){
	char buff[256];
	int error;
	lua_State *L = luaL_newstate();		//打开lua
	luaL_openlibs(L);					//打开标准库


	while(fgets(buff,sizeof(buff),stdin)!=NULL){
		error = luaL_loadbuffer(L,buff,strlen(buff),"line") || lua_pcall(L,0,0,0);
		if(error){
			fprintf(stderr,"%s",lua_tostring(L,-1));
			lua_pop(L,1);		//从栈中弹出错误消息
		}
	}
	lua_close(L);
	return 0;
}</span>




使用栈交互:
优点:除了在c/c++上方便使用还可以轻松应用到其他语言
 如果在C中保存Lua table变量,Lua的垃圾回收无法搜索出这个table不是垃圾文件


在Lua中调用该栈的时候,只会改变栈顶,而使用C可以自由检索中间元素


压入栈元素的CAPI:
lua_pushxxx  :  lua_pushnil(L),lua_pushboolean(L,bool)
压入元素需要提前检查空间:int lua_checkstack(lua_State* L,int sz)


查询栈元素的CAPI:
规则:关于索引->第一个压入栈的元素索引为1;第二个压入索引为2...直到栈顶
还可以以栈顶为参考物:-1表示栈顶元素,-2表示栈顶下面的元素...知道栈底
例子:lua_tostring(L,-1)会将栈顶的值作为一个字符串返回


检查栈中元素的类型:int lua_is*(lua_State* L, int index) : lua_isnumber,lua_istable...
返回栈中元素的类型:lua_type(L,index) : LUA_TNIL,LUA_TBOOLEAN,LUA_TTABLE....
从栈中获取一个值: lua_to*(L,index): lua_toboolean,lua_objlen




其他栈操作:
int lua_gettop(L) : 返回栈元素的个数,或者是栈顶的索引
void lua_settop(L,int index) 使用lua_settop(L,0)可以清空栈,用负数索引可以从栈弹出元素,大于len则用栈顶元素填充
void lua_pushvalue(L,index) 将指定索引元素副本压入栈顶
void lua_remove(L,index) 删除指定索引元素,下移填补
void lua_insert(L,index) 上移所有元素开辟一个槽空间
void lua_replace(L,index) :  弹出栈顶的值,设置到指定索引上(原栈顶移除)


例子:
<span style="font-size:14px;">
	lua_State* L = luaL_newstate();


	lua_pushboolean(L,1);
	lua_pushnumber(L,10);
	lua_pushnil(L);
	lua_pushstring(L,"hello");


	stackDump(L);


	lua_pushvalue(L,-4);
	stackDump(L);


	lua_replace(L,3);
	stackDump(L);


	lua_settop(L,6);
	stackDump(L);


	lua_remove(L,-3);
	stackDump(L);


	lua_settop(L,-5);
	stackDump(L);


	lua_close(L);


	getwchar();</span>




CAPI中的错误处理
使用setjmp机制
“无保护”模式:当Lua发生错误时,Lua会调用一个“紧急”函数,然后Lua会结束应用程序
不会抛出异常的函数:luaL_newstate,lua_load,lua_pcall,lua_close
如果内存分配错误,不想结束应用程序的方法:
1、设置一个“紧急”函数不要把控制权返回给Lua
2、代码在“保护模式”下运行(常用)

------------------------------------------------------------------------
void lua_rawgeti(lua_State *L,int index,int key);
void lua_rawseti(lua_State *L,int index,int key);
void lua_pushnumber(lua_State *L,int key);
void lua_insert(lua_State *L,int index);
void lua_rawget(lua_State *L,int index);
void lua_rawset(lua_State *L,int index);
void luaL_checktype(Lua_State *L,int index, TYPE)  TYPE:LUA_TTABLE,LUA_TFUNCTION
int luaL_checktype(lua_State *L,int index);
void lua_pushvalue(lua_State *L,int index);
void lua_call(lua_State* L,int index,int key);

版权声明:本文为博主原创文章,未经博主允许不得转载。

Lua_CAPI(1)

标签:

原文地址:http://blog.csdn.net/zh13544539220/article/details/47341073

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!