Lua学习笔记-Day05

1、编写供lua调用的C函数

编写一个C函数返回一个table,简单示例代码如下:

//返回一个table
static int l_getmytable(lua_State * L)
{
    lua_newtable(L);
    char str[20] = {0};
    for(int i = 1; i <= 10; i++)
    {
        lua_pushnumber(L,i);//相当于压入key
        sprintf(str, "num is : %d", i);
        lua_pushstring(L,str);//压入value
        lua_settable(L, -3);//将前面的key和value都保存到table中
    }
    return 1;
}

//将l_getmytable函数公开给Lua

static void register_my_functions(lua_State* L)
{
    lua_pushcfunction(L,l_getmytable);
    lua_setglobal(L,"getmytable");
}

int main()
{
    lua_State *ll = luaL_newstate();
    luaL_openlibs(ll);
    register_my_functions(ll);
    luaL_dofile(ll, "call_C.lua");
    lua_close(ll);
    return 0;
}

在call_C.lua文件中调用getmytable函数如下:

local t = getmytable()
for k, v in pairs(t) do
    print(k,v)
end

运行结果如下:

运行结果正常输出了一个table中的key和value。

2、编写一个供Lua调用的C模块。

在lualib项目下的源文件下找到init.c文件

在init.c中编写可供Lua调用的函数,简单示例代码如下:

//可供Lua调用函数1
static int showRlt1(lua_State * L)
{
    lua_pushstring(L,"Im showRLT1");
    return 1;
}
//可供Lua调用函数2
static int showRlt2(lua_State * L)
{
    const char * value = luaL_checkstring(L, -1);
    lua_pushstring(L,value);
    return 1;
}

接着注册一下上面两个函数,实际上就是注册一个结构体数组mylibs(mylibs就是要供Lua调用的C模块):

static const luaL_Reg mylibs[] = {
            {"rlt1",showRlt1},//showRlt1函数注册为rlt1,即在Lua中调用这个函数时使用人rlt1
            {"rlt2",showRlt2},//showRlt2函数注册为rlt2,即在Lua中调用这个函数时使用人rlt2
            {NULL,NULL}
        };

利用上面的结构体数组创建lib:

int luaopen_my_lib(lua_State * L)
{
    luaL_newlib(L,mylibs);
    return 1;
}

然后再init.c文件的结构体数组loadedlibs中加入{"mylibs", luaopen_my_lib}一项:

最后重新生成lualib项目,以使新的模块加到lualib库中:


接下来是在Lua中调用mylibs模块,在call_C.lua文件中编写语句如下:

local mylib = require("mylibs")--引入mylibs模块
print(mylib)--实际结果为一个table

print(mylib.rlt1())--调用mylibs模块中的rlt1函数,实际调用的是init.c文件中的showRlt1函数
print(mylib.rlt2("chenzhenyong"))--调用mylibs模块中的rlt2函数,实际调用的是init.c文件中的showRlt2函数

运行程序,结果如下 :

3、Lua中的线程和状态

lua_State *ll = lua_newthread(luaState);//在当前线程中创建了一个新线程
        //创建了新线程实际上就是在当前状态下创建了一个新状态。创建完的同时将子线程压入栈顶。
    //最后将新线程即新状态返回
    lua_pop(luaState, 0);//这会把栈顶的子线程弹出,之后子线程不在存在。
    //注意子线程的创建依赖于现有的线程。

4、Lua中内存管理方式。Lua 对其内存具有严格控制,当关闭一个Lua状态时,Lua会显式地释放它的所有内存。如果加载了一个很大的Lua模块,并在之后删除了所有对它的引用,Lua最终会回收这个模块使用的所有没存。Lua通过一个“分配函数”来完成所有的你内存分配和释放,当用户创建一个Lua状态时,必须提供这个函数。

Lua中的垃圾回收器。从第一版到5.0版本,采用一种简单的“标记并清扫”垃圾收集器。Lua有时候会为了完成一个完整的垃圾收集周期而暂停与主程序的交互。每个垃圾收集周期分为4个阶段,标记、整理、清扫和收尾。

标记阶段:将所有可到达的对象都标记为活跃。

整理阶段:整理userdata。删除未被标记的key和value。

清扫阶段:遍历所有对象,未标记的就收集,已标记的就清除标记。

收尾阶段:更具整理阶段生成的userdata列表来调用它们的终结函数。

Lua5.1开始使用一种增量式的收集器,步骤与原收集器一样,但是它当的运行不会暂停整个程序的相应。它以隔行扫描的方式与解释器一起工作,每当解释器分配了一些固定的内存后,收集器就会运行一小步。在增量式的收集器中增加了原子操作。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,839评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,543评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,116评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,371评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,384评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,111评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,416评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,053评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,558评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,007评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,117评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,756评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,324评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,315评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,539评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,578评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,877评论 2 345

推荐阅读更多精彩内容

  • 第一篇 语言 第0章 序言 Lua仅让你用少量的代码解决关键问题。 Lua所提供的机制是C不擅长的:高级语言,动态...
    testfor阅读 2,651评论 1 7
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,358评论 0 17
  • 1.1程序块:Lua执行的每段代码,例如一个源代码文件或者交互模式中输入的一行代码,都称为一个程序块 1.2注释:...
    c_xiaoqiang阅读 2,585评论 0 9
  • 你还记得最初因为什么而提笔写文吗?是因为喜欢还是因为利益?我想十个作者应该至少有八个是因为喜欢写才写的吧? 那现在...
    孙小山阅读 431评论 2 2