一. lua调用C++ 在lua中是以函数指针的形式调用函数, 并且所有的函数指针都必须满足如下此种类型: typedef int (*lua_CFunction) (lua_State *L); 也就是说, 偶们在C++中定义函数时必须以lua_State为参数, 以int为返回值才能被Lua所调用. 但是不要忘记了, 偶们的lua_State是支持栈的, 所以通过栈可以传递无穷个参数, 大小只受内存大小限制. 而返回的int值也只是指返回值的个数真正的返回值都存储在lua_State的栈中. 偶们通常的做法是做一个wrapper, 把所有需要调用的函数都wrap一下, 这样就可以调用任意的函数了.
- #include<iostream>
- using namespace std;
- #include<stdio.h>
- extern "C" {
- #include <lua.h>
- #include <lualib.h>
- #include <lauxlib.h>
- }
- //#pragma comment(lib, "lua5.1.lib")
- lua_State* L;
- static int average(lua_State *L)
- {
- //返回栈中元素的个数
- int n = lua_gettop(L);
- double sum = 0;
- int i;
- for (i = 1; i <= n; i++)
- {
- if (!lua_isnumber(L, i))
- {
- lua_pushstring(L, "Incorrect argument to 'average'");
- lua_error(L);
- }
- sum += lua_tonumber(L, i);
- }
- /* push the average */
- lua_pushnumber(L, sum / n);
- /* push the sum */
- lua_pushnumber(L, sum);
-
- /* return the number of results */
- return 2;
- }
- int main (int argc,char*argv[])
- {
- /* initialize Lua */
- L = lua_open();
- /* load Lua libraries */
- luaL_openlibs(L);
- /* register our function */
- lua_register(L, "average", average);
- /* run the script */
- luaL_dofile(L, "e15.lua");
-
- lua_getglobal(L,"avg");
- cout<<"avg is:"<<lua_tointeger(L,-1)<<endl;
- lua_pop(L,1);
- lua_getglobal(L,"sum");
- cout<<"sum is:"<<lua_tointeger(L,-1)<<endl;
- /* cleanup Lua */
- lua_close(L);
-
- return 0;
- }
- //程序
- //*lua_gettop()的作用是返回栈顶元素的序号. 由于Lua的栈是从1开始编号的,
- // 所以栈顶元素的序号也相当于栈中的元素个数. 在这里, 栈中元素的个数就
- // 是传入的参数个数.
- //* for循环计算所有传入参数的总和. 这里用到了数值转换lua_tonumber().
- //* 然后偶们用lua_pushnumber()把平均值和总和push到栈中.
- //* 最后, 偶们返回2, 表示有两个返回值.
- //* 虽然在C++中定义了average()函数, 但Lua程序并不知道, 所以需
- // 要在main函数中加入
- // // register our function
- // lua_register(L, "average", average);
- // 这两行的作用就是告诉e15.lua有average()这样一个函数.
- //* 这个程序可以存成cpp也可以存成c, 如果以.c为扩展名就不需要加extern "C"
- //
- //编译的方法偶们上次说过了, 方法相同.
- //e15.lua执行的方法只能用上例中的C++中执行, 而不能用命令行方式执行.*/
脚本为 avg, sum = average(10, 20, 30, 40, 50) print("The average is ", avg) print("The sum is ", sum) 二. C++调用lua - #include "stdafx.h"
- #include <stdio.h>
- extern "C" {
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
- /* Lua解释器指针 */
- lua_State* L;
- int main ( int argc, char *argv[] )
- {
- /* 初始化Lua */
- L = lua_open();
- /* 载入Lua基本库 */
- luaL_openlibs(L);
- /* 运行脚本 */
- luaL_dofile(L, "Lua1.lua");
- /* 清除Lua */
- lua_close(L);
- /* 暂停 */
- printf( "Press enter to exit…" );
- getchar();
- return 0;
- }
- /* A simple Lua interpreter. */
- #include <stdio.h>
- extern "C" {
- #include <lua.h>
- #include <lualib.h>
- #include <lauxlib.h>
- }
- #include <stdio.h>
- extern "C" { // 这是个C++程序, 所以要extern "C",
- // 因为lua的头文件都是C格式的
- #include "lua.h"
- #include "lualib.h"
- #include "lauxlib.h"
- }
- #pragma comment(lib, "lua5.1.lib")
- /* the Lua interpreter */
- lua_State* L;
- int luaadd ( int x, int y )
- {
- int sum;
- /* the function name */
- lua_getglobal(L, "add"); int nTop = lua_gettop(L); //得到栈的元素个数。栈顶的位置。
- /* the first argument */
- lua_pushnumber(L, x); nTop = lua_gettop(L);
- /* the second argument */
- lua_pushnumber(L, y); nTop = lua_gettop(L);
- /* call the function with 2
- arguments, return 1 result */
- lua_call(L, 2, 1); nTop = lua_gettop(L);
- /* get the result */
- sum = (int)lua_tonumber(L, -1); nTop = lua_gettop(L);
- /*清掉返回值*/
- lua_pop(L, 1); nTop = lua_gettop(L);
- /*取出脚本中的变量z的值*/
- lua_getglobal(L, "z"); nTop = lua_gettop(L);
- int z = (int)lua_tonumber(L, 1);nTop = lua_gettop(L);
- lua_pop(L, 1); nTop = lua_gettop(L);
-
- //没调通
- /*lua_pushnumber(L, 4); nTop = lua_gettop(L);
- lua_setglobal(L, "r"); nTop = lua_gettop(L);
- int r = (int)lua_tonumber(L, 1);nTop = lua_gettop(L);*/
- return sum;
- }
- int main ( int argc, char *argv[] )
- {
- int sum;
- /* initialize Lua */
- L = lua_open();
- /* load Lua base libraries */
- //lua_baselibopen(L);
- /* load the script */
- luaL_dofile(L, "e12.lua");
- /* call the add function */
- sum = luaadd( 10, 15 );
- /* print the result */
- printf( "The sum is %d", sum );
- /* cleanup Lua */
- lua_close(L);
- return 0;
- }
- /*程序说明:
- main中过程偶们上次已经说过了, 所以这次只说说luaadd的过程
- * 首先用lua_getglobal()把add函数压栈
- * 然后用lua_pushnumber()依次把x,y压栈
- * 然后调用lua_call(), 并且告诉程序偶们有两个参数一个返回值
- * 接着偶们从栈顶取回返回值, 用lua_tonumber()
- * 最后偶们用lua_pop()把返回值清掉
- */
脚本为: -- add two numbers function add ( x, y ) return x + y + 2 end z = 6 转自: http://blog.csdn.net/sndaxdrs/article/details/6230999
|