美文网首页Lua Web开发
大话C与Lua(二)调用Lua函数

大话C与Lua(二)调用Lua函数

作者: 水果糖的小铺子 | 来源:发表于2018-01-11 12:32 被阅读0次

    首先我们运行C语言宿主程序,然后从中加载lua脚本。由于加载会失败,所以我们还需要从中判断是否有加载时的语法错误。

    main.c文件:

    #include <stdio.h>
    #include <stdlib.h>
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
    int main()
    {
        lua_State* L = luaL_newstate();
        luaL_openlibs(L);
        printf("——————开始运行脚本——————\n");
        printf("栈顶的索引为:%d\n",lua_gettop(L));
        if(0!= luaL_loadfile(L, "main.lua")){
            printf("加载lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
            exit(0);
        }
        printf("栈顶的索引为:%d\n",lua_gettop(L));
        if(0!= lua_pcall(L,0,0,0)){
            printf("初始化lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
        }
        printf("栈顶的索引为:%d\n",lua_gettop(L));
        printf("——————脚本运行完毕——————\n");
        lua_close(L);
        return 0;
    }
    

    main.lua文件:

    function add(x,y)
        print(x + y,"\n")
    end
    .
    

    编译运行后,我们查看输出结果:

    [root@localhost ~]# cc -o main main.c -Wall -O2 -llua -lm -ldl
    [root@localhost ~]# ./main 
    ——————开始运行脚本——————
    栈顶的索引为:0
    加载lua脚本错误:
    main.lua:4: unexpected symbol near '.'
    [root@localhost ~]# 
    

    上面输出抛出了一个错误!

    我们发现在main.lua的第四行,有一个无法解析的符号"."。

    原来是我不小心输入的时候多按了一个符号。

    [root@localhost ~]# cc -o main main.c -Wall -O2 -llua -lm -ldl
    [root@localhost ~]# ./main 
    ——————开始运行脚本——————
    栈顶的索引为:0
    加载lua脚本错误:
    main.lua:4: unexpected symbol near '.'
    [root@localhost ~]# ./main 
    ——————开始运行脚本——————
    栈顶的索引为:0
    栈顶的索引为:1
    栈顶的索引为:0
    ——————脚本运行完毕——————
    [root@localhost ~]# 
    

    修改后再次运行后,正常输出!

    从输出内容我们发现,在loadfile之前虚拟栈的栈顶索引为0,加载脚本后栈顶内容为1。

    然而在我们运行pcall执行脚本后,虚拟栈又被清空后,栈顶索引又变成0;

    现在我们再调用lua_getglobal API将lua脚本内的函数add入栈,然后传入2个参数来计算加法。

    #include <stdio.h>
    #include <stdlib.h>
    #include <lua.h>
    #include <lualib.h>
    #include <lauxlib.h>
    
    
    int main()
    {
        lua_State* L = luaL_newstate();
        luaL_openlibs(L);
        printf("——————开始运行脚本——————\n");
        printf("栈顶的索引为:%d\n",lua_gettop(L));
        if(0!= luaL_loadfile(L, "main.lua")){
            printf("加载lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
            exit(0);
        }
        printf("栈顶的索引为:%d\n",lua_gettop(L));
        if(0!= lua_pcall(L,0,0,0)){
            printf("初始化lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
        }
        printf("栈顶的索引为:%d\n",lua_gettop(L));
        lua_getglobal(L,"add");
        printf("函数add入栈,此时栈顶的索引为:%d\n",lua_gettop(L));
        lua_pushnumber(L,10);
        lua_pushnumber(L,10);
        printf("函数参数入栈,此时栈顶的索引为:%d\n",lua_gettop(L));
        lua_pcall(L,2,0,0);
        printf("执行函数后,栈顶的索引为:%d\n",lua_gettop(L));
        printf("——————脚本运行完毕——————\n");
        lua_close(L);
        return 0;
    }
    

    最终运行结果:

    [root@localhost ~]# cc -o main main.c -Wall -O2 -llua -lm -ldl
    [root@localhost ~]# ./main 
    ——————开始运行脚本——————
    栈顶的索引为:0
    栈顶的索引为:1
    栈顶的索引为:0
    函数add入栈,此时栈顶的索引为:1
    函数参数入栈,此时栈顶的索引为:3
    20.0    
    
    执行函数后,栈顶的索引为:0
    ——————脚本运行完毕——————
    [root@localhost ~]# 
    

    相关文章

      网友评论

        本文标题:大话C与Lua(二)调用Lua函数

        本文链接:https://www.haomeiwen.com/subject/qkvznxtx.html