csdn學習筆記:lua擴充套件c程式 c/c++訪問lua變數和函式
阿新 • • 發佈:2018-11-09
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;
}