前節で登場したsample.luaから変数NAMEとSIZEの値を取得してみましょう.
NAMEは文字列で取得し,SIZEはNUMBERで取得します.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
int main (void)
{
//Luaを開く
lua_State* L = luaL_newstate();
//Luaの標準関数を使用できる状態にする
luaL_openlibs(L);
//Luaファイルsample.luaを読み込む
if( luaL_loadfile(L, "sample.lua") || lua_pcall(L, 0, 0, 0) ) {
printf("sample.luaを開けませんでした\n");
printf("error : %s\n", lua_tostring(L, -1) );
return 1;
}
//PATHを取得しスタックに積む
lua_getglobal(L, "NAME");
//SIZEを取得しスタックに積む
lua_getglobal(L, "SIZE");
if( !lua_isstring(L, -2) || !lua_isnumber(L, -1) ) {
printf("正しく値が取得できませんでした\n");
return 1;
}
printf("NAME : %s\n", lua_tostring(L, -2));
printf("SIZE : %d\n", lua_tointeger(L, -1));
lua_close(L);
return 0;
}
実行結果
NAME : HELLOWORLD
SIZE : 640
lua_getglobal関数はグローバル変数を取得する変数で以下のように定義されています.
void lua_getglobal (lua_State *L, const char *name);
nameには取得したいグローバル変数の変数名を指定します.
実はこの関数はlua_gettable関数のマクロとなっています.
#define lua_getglobal(L,s) lua_getfield(L, LUA_GLOBALSINDEX, s)
LUA_GLOBALSINDEXはLuaのグローバル変数がある領域テーブルを指しています.
さて,上記のサンプルですがスタックにはNAMEとSIZEが残ったままになっています.
実際のプログラムではNAME,SIZEを使用したあとはきちんとポップしておきましょう.