lua 调用文件中的函数调用_四、C++获得Lua的变量和Table的值
上兩篇文章都已經把Lua和C++函數的調用講完了,這篇開始講變量和Table的調用。
這篇文章主要是講C++怎么調用獲得Lua中的變量和Table的值,并且把lua中的值打印出來。
一、直接上代碼:
1、在Test.lua文件內添加如下代碼:
print "Hello, Lua Demo4!"
name="my name is lua"
nameTable={sex = "male", age=18}
2、在LuaTest.cpp文件內添加如下代碼:
#include <stdio.h>
extern "C" {
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
lua_State* L;
int main(int argc, char *argv[])
{
L = lua_open();
luaL_openlibs(L);
luaL_dofile(L, "Test.lua");
lua_settop(L, 0);
//code1
lua_getglobal(L, "name");
//code2
int isStr = lua_isstring(L, -1);
if (isStr == 0)
{
printf("stack top is not stringn");
}
else
{
printf("stack top is stringn");
}
//code3
const char* strName = lua_tostring(L, -1);
printf("name: %sn", strName);
//code4
lua_getglobal(L, "nameTable");
//code5
lua_pushstring(L, "sex");
lua_gettable(L, -2);
lua_pushstring(L, "age");
lua_gettable(L, -3);
//code6
int iAge = (int)lua_tointeger(L, -1);
const char* strSex = lua_tostring(L, -2);
printf("age: %dn", iAge);
printf("sex: %sn", strSex);
lua_close(L);
/* pause */
printf("Press enter to exit...");
getchar();
return 0;
}
二、代碼分析,曾經講過的函數這里就不做分析了,不明白的,可以去看前面的文章。
code1、因為luaL_dofile(L, "Test.lua")已經把lua文件加載到內存并行執行了pcall函數。lua_getglobal(L, "name")就是從全局表中找到name字段對應的值,并把它放到棧頂??梢詤⒖紬5倪\行圖Log index 1
code2、lua_isstring(L, -1)是用來判斷棧頂是否是string類型,還有一些類似的函數,可以自行查看API。
code3、lua_tostring(L, -1)從棧頂取出值,然后賦值給一個變量使用。數據還在棧沒,沒有彈出。
code4、lua_getglobal(L, "nameTable")從全局表中找到nameTable對應的數據,并把他放到棧頂。此時棧內有兩條數據了,看棧的運行圖Log index 2
code5、lua_pushstring是向棧內壓如一個值。lua_gettable是從table中取出剛才壓入的數據對應的值,并且替換掉sex。從棧的運行圖Log index 3中,可以清晰的看出,數據已經從table中取出放到棧上了
code6、分別使用系統函數 lua_tointeger和lua_tostring取出棧上面的值。最終棧內是四個值,如棧的運行圖Log index 4。如果此時調用lua_settop(L, 0) 那么會清空棧內所有的數據。
三、運行結果如下圖
四、程序運行時棧內的變化情況如下圖:
項目測試源碼地址在第一篇文章末尾:爐石不傳說:一、搭建C++調用Lua環境如果你感覺這篇文章對你有用,請隨手點贊或評論,你的點贊操作可以讓更多想學習的人更容易找到這篇文章,謝謝!總結
以上是生活随笔為你收集整理的lua 调用文件中的函数调用_四、C++获得Lua的变量和Table的值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue 封装组件供全局使用_vue 封装
- 下一篇: python index函数时间复杂度_