C言語側からLuaのグローバル変数を登録してみましょう.
ここではTESTという変数(値は10とする)を登録してみます.
まずは次のようなコード,sample.luaを作ります.
--sample.lua
function show()
if TEST == nil then
print("TESTは登録されていません")
else
print("TEST の値は" .. TEST .. "です")
end
end
そしてC言語側のコードは次のようになります.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
void showTest(lua_State* L)
{
//show関数をスタックに積む
lua_getglobal(L, "show");
//show関数を呼び出す 引数0個, 戻り値0個
if(lua_pcall(L, 0, 0, 0) != 0) {
printf("関数呼び出し失敗\n");
printf("error : %s\n", lua_tostring(L, -1) );
lua_pop(L, 1);
}
}
int main (void)
{
int x = 10, y = 5;
//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;
}
//Luaのshow関数を呼び出す
showTest(L);
//変数TEST(値は10)をLuaに登録
lua_pushnumber(L, 10);
lua_setglobal(L, "TEST");
//TEST表示
showTest(L);
lua_close(L);
return 0;
}
実行結果
TESTは登録されていません
TEST の値は10です
Luaのshow関数を呼び出すためのC言語関数showTestを作成しました.
1回目にshow関数が呼び出された時は,変数TESTはまだ存在しないので
nilとなっています.
2回目に呼び出された時は,C言語側からTEST=10として登録されているので,
値が表示されます.
さて,グローバル変数を登録するにはlua_setglobal関数を使用します.
void lua_setglobal (lua_State *L, const char *name);
この関数はスタックトップの値をnameとしてLuaに登録します.
実はlua_setglobal関数はlua_setfield関数のマクロとして定義されています.
#define lua_setglobal(L,s) lua_setfield(L, LUA_GLOBALSINDEX, s)