美文网首页Lua Web开发
大话C与Lua(四) 让C注入的函数可以返回多个值

大话C与Lua(四) 让C注入的函数可以返回多个值

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

众所周知,C语言只能给函数调用者返回1个值。即使函数调用时发生了错,最多也仅返回一个NULL。

为此大家想出了一些应对策略:

1、返回结构体指针;

2、print message;

3、 打 log;

现今许多语言都支持多返回值:Python 、Lua 、 GoLang等等,多返回值的好处也不言而喻。

今天我们就来说说前面我们为Lua注入cmath库后,返回多个值的方法。

同时为了方便说明,我们将四则运算用一个函数来表示并依次返回4个返回值。

main.c

#include <stdio.h>
#include <stdlib.h>
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>

int lfao(lua_State* L){
    double x = luaL_checknumber(L,-2); // 从栈上拿到x
    double y = luaL_checknumber(L,-1); // 从栈上拿到y
    lua_settop(L,0);           // 清空当前栈  
    lua_pushnumber(L,x + y);   // 做加法运算后将结果压栈
    lua_pushnumber(L,x - y);   // 做减法运算后将结果压栈
    lua_pushnumber(L,x * y);   // 做乘法运算后将结果压栈
    lua_pushnumber(L,x / y);   // 做除法运算后将结果压栈
    return 4;
}

const luaL_Reg mylib[] = {
    {"fao",lfao},
    {NULL,NULL}
};

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);
    luaL_newlib(L,mylib);
    lua_setglobal(L,"cmath");
    printf("——————开始运行脚本——————\n");
    if(0!= luaL_loadfile(L, "main.lua")){
        printf("加载lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
        exit(0);
    }
    if(0!= lua_pcall(L,0,0,0)){
        printf("初始化lua脚本错误:\n%s\n",luaL_checkstring(L,-1));
    }
    printf("——————脚本运行结束——————\n");
    lua_close(L);
    return 0;
}

main.lua

for k,v in pairs(cmath) do
    print(k,v)
end
print(cmath.fao(10,10))

运行结果:

[root@localhost ~]# cc -o main main.c -Wall -O2 -ldl -lm -llua
[root@localhost ~]# ./main 
——————开始运行脚本——————
fao function: 0x401fe0
20.0    0.0 100.0   1.0
——————脚本运行结束——————
[root@localhost ~]# 

从运行结果中,我们看出:

为Lua注入的库内只有一个函数fao,这个函数表示四则运算。

return关键字后面跟的数字表示C函数是否有返回值(0表示没有返回值,大于0表示有多少个返回值)。

注意!返回值的顺序就是你压栈的顺序,千万不要写错。

至于既能返回2个值,又能返回三个值的方法。无非就是判断语句后面自己设计好return的数字。

此处就不再过多阐述和示例了。

相关文章

  • 大话C与Lua(四) 让C注入的函数可以返回多个值

    众所周知,C语言只能给函数调用者返回1个值。即使函数调用时发生了错,最多也仅返回一个NULL。 为此大家想出了一些...

  • Lua学习笔记1

    1.函数返回值丢失 在lua中,函数可以有多个返回值 function foo() return 1,2endp...

  • lua和C相互调用

    lua可以通过与C函数相互调用来扩展程序功能,在C中嵌入lua脚本既可以让用户在不重新编译代码的情况下修改lua代...

  • 大话C与Lua(三)我是这样注入C函数的

    Lua 使用 luaL_openlibs 这个API来注入所有内置库。 而自己用C实现的Lua第三方库是通过类似 ...

  • lua和c的初始

    lua和c的交互包括:c访问lua的变量、c访问lua的table、c调用lua的方法、lua调用c的函数 参考链...

  • swift学习笔记之元祖

    可以将多个值保存在一起 特点: 元祖可以保存不同数据类型的值 用途:在C/OC中如果一个函数想返回多个值需要借助指...

  • Lua学习笔记-Day05

    1、编写供lua调用的C函数 编写一个C函数返回一个table,简单示例代码如下: //返回一个tablestat...

  • C Lua API-栈

    简介 C API 是一组能使用C代码与Lua交互的函数。其中包括读写Lua全局变量、调Lua函数、运行一段Lua代...

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

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

  • Golang九大特性

    强类型静态编译型语言。 更丰富的内置类型 函数多返回值 在C中如果想返回多个值,通常会在调用函数中分配返回值的空间...

网友评论

    本文标题:大话C与Lua(四) 让C注入的函数可以返回多个值

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