1. 程式人生 > >csdn學習筆記:lua擴充套件c程式 c/c++訪問lua變數和函式

csdn學習筆記:lua擴充套件c程式 c/c++訪問lua變數和函式

aa.lua

teacher = "guilinwang";
org = "nzhsoft";
object = "lua";
age = 28;

tab =  {
    teacher = "guilinwang_tab",
    org = "nzhsoft_tab",
    object = "lua_tab",
    age = 38,
    func_tab = function (num,string)
        print("number=",num);
        print("string=",string);
        return 1,2,3,4,5;
    end
}


function func()
    print("hello lua!!!");
end


function func2(num,string)
    print("number=",num);
    print("string=",string);
end


function func3(num,string)
    print("number=",num);
    print("string=",string);
    return 1,2,3,4,5;
end

c/c++訪問lua全域性變數

1、int lua_getglobal (lua_State *L, const char *name); 使用lua_getglobal() 把name成員壓入到棧,位置是在-1

2、使用lua_tonumber(L,-1)   從棧中得到lua中name變數的值

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"


int main(){
    lua_State* L = luaL_newstate();    //建立一個lua虛擬機器(lua上下文),類似於指標
	luaL_openlibs(L);


    luaL_dofile(L, "aa.lua");      //把lua檔案載入到虛擬機器,並編譯執行

    
    lua_getglobal(L, "teacher");    //idx=1    
	lua_getglobal(L, "org");		//idx=2
	lua_getglobal(L, "object");		//idx=3
	lua_getglobal(L, "age");		//idx=4

    ////棧記憶體儲的資料為
	////age,object,org,teacher
	if (lua_isnumber(L, -1)){
		int num = lua_tonumber(L, -1);
		printf("num = %d\n", num);
	}

    lua_pop(L, 1);   //彈出棧頂元素,這樣第二個object就是-1索引

    if (lua_isstring(L, -1)){
		char* str = lua_tostring(L, -1);
		printf("str = %s\n", str);
	}



    lua_close(L);

    
    system("pause");
	return 0;
}

c/c++訪問全域性table

	###############################訪問lua全域性table##################################
	lua_getglobal(L, "tab");			//idx = -2  || 1
	lua_pushstring(L, "teacher");		//idx = -1  || 2     //先把key push到棧上去

	lua_gettable(L, -2);                 //這裡會把索引2的資料"teacher"彈出,把資料value放在索引2,原來'teacher'的位置
	/*
	1、先push key 2、再gettable(L,-2)  tab在棧中的索引
	*/
	if (lua_isstring(L, -1))
	{
		char* str = (char*)lua_tostring(L, -1);
		printf("str = %s\n", str);
	}


	lua_pop(L,1);  //彈出棧頂1個元素,就是彈出棧頂

	lua_pushstring(L, "age");
	lua_gettable(L, -2);
	if (lua_isnumber(L, -1))
	{
		int num = lua_isnumber(L, -1);
		printf("num = %d\n", num);
	}

c/c++訪問lua函式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"


int main(){
    lua_State* L = luaL_newstate();    //建立一個lua虛擬機器(lua上下文),類似於指標
	luaL_openlibs(L);


    luaL_dofile(L, "aa.lua");      //把lua檔案載入到虛擬機器,並編譯執行


    //有參無返回
    lua_getglobal(L, "func");
	lua_pcall(L, 0, 0, 0);  //執行完成後會清理棧

    //有參無返回
	lua_getglobal(L, "func2");
	lua_pushnumber(L, 101);
	lua_pushstring(L, "fangfang");   //棧 1:func,2:101,3:"fangfang"
	lua_pcall(L, 2, 0, 0);  //引數二:n個引數, 引數三: n個返回值 ,引數四:通常為0
    
    //有參有返回
	lua_getglobal(L, "func3");
	lua_pushnumber(L, 101);
	lua_pushstring(L, "fangfang");   //棧 1:func,2:101,3:"fangfang"
	lua_pcall(L, 2, 5, 0);    //函式有2個引數,5個返回值

	printf("1->%g\n", lua_tonumber(L, -1));    //%g 用tonumber     5
	printf("2->%d\n", lua_tointeger(L, -2));	//%d 用tointerger   4
	printf("3->%d\n", lua_tointeger(L, -3));    //   3


    lua_close(L);

    
    system("pause");
	return 0;
}

c/c++訪問表裡面的函式

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"


int main(){
    lua_State* L = luaL_newstate();    //建立一個lua虛擬機器(lua上下文),類似於指標
	luaL_openlibs(L);


    luaL_dofile(L, "aa.lua");      //把lua檔案載入到虛擬機器,並編譯執行

    lua_getglobal(L, "tab");        //tab idx = -1
	lua_getfield(L, -1, "func_tab");   //func_tab idx = -1 ,tab idx = -2;
	lua_remove(L, -2);             //把tab移除棧,函式只有在棧底(1)才可以執行

	lua_pushnumber(L, 101);        
	lua_pushstring(L, "fangfang");   //棧 1:func_tab,2:101,3:"fangfang"

	//stackDump(L);

	lua_pcall(L, 2, 5, 0);    //函式有2個引數,5個返回值

    //lua返回了 1,2,3,4,5
	printf("1->%g\n", lua_tonumber(L, -1));    //%g 用tonumber  5
	printf("2->%d\n", lua_tointeger(L, -2));	//%d 用tointerger  4
	printf("3->%d\n", lua_tointeger(L, -3));    //  3

    lua_close(L);

    
    system("pause");
	return 0;
}
	

還可以使用lua_getfield()來訪問table,lua_getfield()相當於lua_pushstring() 和 lua_gettable(L, -2)的合體功能

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"


int main(){
    lua_State* L = luaL_newstate();    //建立一個lua虛擬機器(lua上下文),類似於指標
	luaL_openlibs(L);


    luaL_dofile(L, "aa.lua");      //把lua檔案載入到虛擬機器,並編譯執行

     lua_getglobal(L, "tab");

	lua_getfield(L, -1, "teacher");
	if (lua_isstring(L, -1))
	{
		char* str = (char*)lua_tostring(L, -1);
		printf("str = %s\n", str);
	}

	lua_pop(L, 1);

	lua_getfield(L, -1, "age");
	if (lua_isnumber(L, -1))
	{
		int num = lua_isnumber(L, -1);
		printf("num = %d\n", num);
	}

    lua_close(L);

    
    system("pause");
	return 0;
}