C语言调用Lua函数

记得上学时,初中英文课本中,上网叫做surfing the internet,中文叫网上冲浪。那个时期,人们经常称互联网为赛博空间。如今工作了,大量的零碎时间用于上微博,知乎,QQ,这些碎片化的阅读让人读起来轻松,也能获取些粗浅的信息。然而它们是消耗时间的黑洞,时间就这样一分一秒地飞逝,年末的时候,知乎会告诉你回答了多少问题,阅读了相当于一部《红楼梦》那么多的文字。只是当你静下来一想,这些浅阅读并没给你带来有深度,系统的知识。在你的时间线上,两条相邻信息往往是八竿子也打不着的。而且你还时不时去看看关注者有没有更新,期待让你眼前一亮的信息。结果往往是趁兴而去,败兴而回。屏幕上的信息永无止境地滚动着,是如此的热闹,仿佛每个人都在狂欢,而我的内心却如此的空虚与孤独。

在lua API中,调用一个函数的步骤很简单:

1.压入你要调用的函数,使用lua_getglobal。

2.压入调用参数。

3.使用lua_pcall

4.从栈中弹出结果。

举例说明,假设你有这么一个lua函数:

function f (x, y)

return (x^2 * math.sin(y))/(1 - x)

end

那么,我们就可以定义个c函数来封装这个调用:

/* call a function ‘f‘ defined in Lua */

double f (double x, double y)

{

double z;

lua_getglobal(L, "f");

lua_pushnumber(L, x);

lua_pushnumber(L, y);

/* do the call (2 arguments, 1 result) */

if (lua_pcall(L, 2, 1, 0) != 0)

error(L, "error running function ‘f‘: %s",

lua_tostring(L, -1));

if (!lua_isnumber(L, -1))

error(L, "function ‘f‘ must return a number");

z = lua_tonumber(L, -1);

lua_pop(L, 1);

return z;

}

lua_pcall在压入结果的之前,会将函数,和参数弹出,如果返回多个结果,第一个最先压入。如果lua_pcall运行出错,那么会返回个非0值。

(完)

时间: 2024-07-31 14:21:23

C语言调用Lua函数的相关文章

C中调用Lua函数

我们先来看一个简单的例子: lua_State* L = NULL; // 内部调用lua函数 double f(double x, double y) { double z; lua_getglobal(L, "f"); // 获取lua函数f lua_pushnumber(L, x); // 压入参数x和y lua_pushnumber(L, y); if(lua_pcall(L, 2, 1, 0) != 0) error(L, "error running functi

cocos2d-x 3.0 在C++中调用lua函数(2)

个人觉得3.0里面, 在C++下面调用lua函数很不方便, 所以就扩展了一个类, 继承自LuaStack, 代码和使用方式如下: #ifndef __CC_LUA_STACKEX_H_ #define __CC_LUA_STACKEX_H_ #include "CCLuaStack.h" NS_CC_BEGIN class LuaStackEx : public LuaStack { public: void call_script_fun(const char* fun) { exe

uLua学习之调用Lua函数(五)

前言 在我开始这个系列的第一篇文章中,我就提到了Lua脚本用来实现宿主脚本的配置性和扩展性.上节说到的调用外部Lua脚本就对应了它的两大特性之一的配置性,那么另一大特性如何来体现呢?这就要说我们今天的话题了:Lua函数.uLua插件是用来解决unity3d热更新的方案,在我们需要对宿主程序做一些局部逻辑上的修改时,Lua函数就变得至关重要.那么如何在uLua中来调用Lua函数呢,现在就来看看吧!我们将通过两个例子来了解如何调用Lua函数. 第一个例子 首先,这个例子的函数是非常简单的,所以我们就

C语言调用lua

在lua API中,调用一个函数的步骤很简单: 1.压入你要调用的函数,使用lua_getglobal. 2.压入调用参数. 3.使用lua_pcall 4.从栈中弹出结果. 举例说明,假设你有这么一个lua函数: function f (x, y)     return (x^2 * math.sin(y))/(1 - x)end 那么,我们就可以定义个c函数来封装这个调用: /* call a function 'f' defined in Lua */double f (double x,

cocos2d-x 3.0 在C++中调用lua函数

代码用的是<cocos2d-x 3.0 在lua中调用自定义类>中的代码. 在上篇的基础上进行扩充. 写lua函数 local function process_packet(user_data) if user_data then user_data = tolua.cast(user_data, "user_data"); print (user_data:uid()); print (user_data:uname()); end end local ghall =

c++调用lua函数2中方式

http://my.oschina.net/kkkkkkkkkkkkk/blog/521496 上一篇 续集 .. 其中handler 通过手动改 tolua 生成的 cpp文件获取 .. void toLuaFunc::callLuaFunc(const char*ARG) { CC_ASSERT(handler > 0, "call lua func 's handle must bigger than 0"); /* 方法1   发送事件到lua cocos2d::Comm

C#调用LUA函数

using UnityEngine; using System.Collections; using LuaInterface; public class testLUACALL : MonoBehaviour { // Use this for initialization void Start () { LuaState S = new LuaState(); if (S == null) return; S.Start(); S.DoFile("test1.lua"); S.Do

C++调用LUA函数,可变参模板实现

代码: /// FUNCTION TEMPLATE: luax_vcall template<typename..._Args> inline void luax_vcall(const char* func, _Args...args); template<typename _Result, typename..._Args> inline _Result luax_vxcall(const char* func, _Args...args); /// TEMPLATE luax

Lua调用C函数

在上一篇文章(C调用lua函数)中,讲述了如何用c语言调用lua函数,通常,A语言能调用B语言,反过来也是成立的.正如Java 与c语言之间使用JNI来互调,Lua与C也可以互调. 当lua调用c函数时,使用了和c调用lua中的同一种栈,c函数从栈中得到函数,然后将结果压入栈中.为了区分返回结果和栈中的其他值,每一个函数返回结果的个数. 这里有个重要的概念:这个栈不是全局的结构,每个函数都有自己的私有局部栈.哪怕c函数调用了lua代码,lua代码再次调用该c函数,他们有各自独立的局部栈.第一个参