Calling Lua function from C++

http://blog.csdn.net/cnjet/article/details/5909519

Calling Lua function from c++ is very simple. Value passing between c++ and Lua goes through stack, Lua C API provides a convenience ways for you to call Lua function from C. To call Lua function, you need to specify:

1. Function Name.
2. Parameters of function call.
3. Return values expected ( Lua function support multiple results reture)

Let say my lua function name call f in last.lua, takes 2 parameters.

-- last.lua
function f (x, y)
    return (x^2 * math.sin(y))/(1 - x)
end

I perform function call from c++ like this:

01 //last.cc
02 # extern "C" {
03 # #include "lua.h"
04 # #include "lualib.h"
05 # #include "lauxlib.h"
06 # } 
07  
08 int main()
09 {
10     double z;
11     lua_State *L = lua_open();
12     luaL_openlibs(L);
13     if (luaL_loadfile(L, "last.lua") || lua_pcall(L, 0, 0, 0)) {
14         printf("error: %s", lua_tostring(L, -1));
15         return -1;
16     }
17  
18     lua_getglobal(L, "f");
19     if(!lua_isfunction(L,-1))
20     {
21         lua_pop(L,1);
22         return -1;
23     }
24     lua_pushnumber(L, 21);   /* push 1st argument */
25     lua_pushnumber(L, 31);   /* push 2nd argument */
26  
27     /* do the call (2 arguments, 1 result) */
28     if (lua_pcall(L, 2, 1, 0) != 0) {
29         printf("error running function `f‘: %s/n",lua_tostring(L, -1));
30         return -1;
31     }
32  
33     /* retrieve result */
34     if (!lua_isnumber(L, -1)) {
35         printf("function `f‘ must return a number/n");
36         return -1;
37     }
38     z = lua_tonumber(L, -1);
39     printf("Result: %f/n",z);
40     lua_pop(L, 1);
41     lua_close(L);
42  
43     return 0;
44 }

Compile it with g++ like this:

g++ -o last{,.cc} -llua -ldl

The results:

Result: -12.158958

Brief explanation of the C++ codes above:
First, I trigger lua_getglobal to get the function name, then I push 2 parameters to stack. I make lua_pcall by telling Lua I have 2 params and expect 1 value return. Upon success, I retrieve the return value from the top of the stack.

时间: 2024-10-21 02:05:52

Calling Lua function from C++的相关文章

calling c++ function from Lua, implement sleep function

http://blog.csdn.net/cnjet/article/details/5909548 You can’t call c function directly from Lua, you have to create a wrapper function that allows calling from Lua. In this post, shows a simple example to implement millisecond sleep function to Lua us

Lua function 函数

Lua支持面向对象,操作符为冒号‘:’.o:foo(x) <==> o.foo(o, x). Lua程序可以调用C语言或者Lua实现的函数.Lua基础库中的所有函数都是用C实现的.但这些细节对于lua程序员是透明的.调用一个用C实现的函数,和调用一个用Lua实现的函数,二者没有任何区别. 函数的参数跟局部变量一样,用传入的实参来初始化,多余的实参被丢弃,多余的形参初始化为nil. count=0 function incCount(n) n=n or 1 count=count+n end i

call lua function from c and called back to c

Just a simple example: --The  c file: #include <stdio.h> #include "lua.h" #include "luaconf.h" #include "lualib.h" #include "lauxlib.h" #include "math.h" static int l_sin (lua_State *L) { double d =

Lua function函数,可变参数, 局部函数,尾递归优化

在Lua中,函数是作为"第一类值"(First-Class Value),这表示函数可以存储在变量中,可以通过参数传递给其他函数,或者作为函数的返回值(类比C/C++中的函数指针),这种特性使Lua具有极大的灵活性. Lua对函数式编程提供了良好的支持,可以支持嵌套函数. 另外,Lua既可以调用Lua编写的函数,还可以调用C语言编写的函数(Lua所有的标准库都是C语言写的). 定义一个函数 function hello() print('hello') end hello函数不接收参数

[ISSUE]lua function

刚开始使用lua,还有点不熟悉 class 是网上常见的实现 Test = class("Test") function Test:ctor() self.vark = 0 end function Test:isTest() self.vark = 0 end 如果调用self.isTest() 报错 self is a nil var 如果使用self:isTest() 正确 待解

lua function

local function demoA() print "demoA" end local function demoB () print "demoB" end local function forfun() print "in forfun" end forfun( demoB ) print("========") forfun( demoA() ) 输出结果: in forfun ======== demoA in

《Programming in Lua 3》读书笔记(二十二)

日期:2014.8.6 PartⅣ The C API 26 Extending Your Application 使用Lua很重要的一点是用来做配置语言.配合主语言做一些功能的配置. 26.1 The Basics 有的时候程序需要配置一些功能信息,很多时候可能有许多别的方法比用lua做配置要更简单:如使用环境变量或者读取文件,读取文件涉及到文件的解析.如果使用Lua进行配置的话,相当于用lua文件替代了要读取的如csv.txt文件等. 使用Lua进行配置的时候,就需要使用Lua API去控制

PatentTips – Java native function calling

BACKGROUND OF INVENTION This invention relates to a system and method for providing a native function call facility. In particular it relates to a system and method for providing a native function call facility in a Java Virtual Machine (JVM) for pla

C\C++和Lua是如何进行通信的?

为了实现Lua和其他语言之间的通信,Lua虚拟机为C\C++提供了两个特性: 一,Lua_State状态机 lua_State主要是管理一个lua虚拟机的执行环境, 一个lua虚拟机可以有多个执行环境.Lua虚拟机通过维护这样一个虚拟栈来实现两种之间的通信,lua_State定义如下: struct lua_State {   CommonHeader;   lu_byte status;   StkId top;  /* first free slot in the stack */   gl