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

    众所周知,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 的数字。

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

  

转载于:https://my.oschina.net/CandyMi/blog/1142707

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值