lua Capi

Posted czwlinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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("
");
}

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则表示容纳的下。

 

以上是关于lua Capi的主要内容,如果未能解决你的问题,请参考以下文章

VS2010编译调用Lua程序

Lua_C_API

什么是Lua?

lua 怎么添加函数

C与lua交互--lua调用栈分析

Lua与C语言的互相调用