lua Capi
一、C环境使用mingw 的gcc
可从这里下载完整版那的mingw: http://pan.baidu.com/s/1crx1s
可参考该设置环境变量及编译lua的教程:https://www.cnblogs.com/jessicas/articles/4477655.html?tdsourcetag=s_pctim_aiomsg
lua要使用该mingw进行编译;记住不要使用5.1.5版本的lua;编译会有问题
我使用sublime进行编码,可以设置如下的编译配置:
{ "working_dir": "$file_path", "cmd": "gcc -Wall \"$file_name\" -o \"${file_base_name}.exe\" -llua", "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$", "selector": "source.c", "variants": [ { "name": "Run", "shell_cmd": "gcc -Wall \"$file_name\" -o \"${file_base_name}.exe\" -llua && start cmd /c \"\"${file_path}/${file_base_name}.exe\" & pause\"" } ] }
二、lua跟c之间的参数传递使用的是栈的方式:fifo
关于lua栈的操作方法有如下testStack里面用到的;
void stackDump(lua_State* L) { int i; int top = lua_gettop(L); for (i = 1; i <= top; ++i) { int t = lua_type(L, i); switch(t) { case LUA_TSTRING: { printf("‘%s‘", lua_tostring(L, i)); break; } case LUA_TBOOLEAN: { printf(lua_toboolean(L, i)?"true":"false"); break; } case LUA_TNUMBER: { printf("%g", lua_tonumber(L, i)); break; } default: { printf("%s", lua_typename(L, t)); break; } } printf(" "); } printf("\n"); } void TestStack(lua_State* L) { 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); // 将栈的大小设置为6;如果之前栈大于6,则变成6;如果之前栈小于6,则新增的栈的位置赋nil stackDump(L); lua_remove(L, -3); // 移除从栈顶往下数,第三个的栈值 stackDump(L); // lua_settop(L, -5); // 相当于删除栈顶的5个元素 lua_insert(L, -4); // 将栈顶的值取出插入到从栈顶往下数第四个的位置;则之后的三个值网上移。注意这个跟lua_replace的区别 stackDump(L); }
三、查询元素
有lua_is*(lua_State* L, int index) 查询对应的是什么类型的元素 lua_isnumber,lua_isstring, lua_istable等
isnumber判断的是该值能否转成数字,不一定是数字。所以对于任何数字,isstring一定是返回真。
查看类型有另外一个函数:lua_type 返回该类型,他们用常量代替;
获取值的有lua_tostring,lua_tolstring, 查看源码可以发现
#define lua_tostring(L,i) lua_tolstring(L, (i), NULL)
lua_tostring是一个宏;
返回的是const char* 类型的;第三个参数可以返回字符串的长度;如下所示
const char *(lua_tolstring) (lua_State *L, int idx, size_t *len);
向查询当前栈中有多少个值,可以使用lua_gettop()函数
默认情况下lua的栈可以装20个值;如果任务比较多,可以使用
lua_checkstack这个函数来检查栈中是否有足够的空间。如果返回0则表示false,1则表示容纳的下。