Lua C APIは第1引数に lua_State のポインターを渡す必要があります。Luaはエラーがなければ LUA_OK(=0)を返します。
[hr]
Luaからグローバル変数の値を取得 こういう Luaのグローバル変数がある場合は
- lua_getglobal関数でLuaの変数名を指定
- lua_toXXXの関数で実際に値を取り出す。
- スタックが残ったままになっているので lua_popでスタックを空っぽにする
実際のコード例は以下のようになります。
#include
#include
#include "PrintStack.h"
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
if (luaL_dofile(L, "sample.lua") != LUA_OK) {
printf("error:%s\n", lua_tostring(L, -1));
lua_close(L);
return -1;
}
lua_getglobal(L, "w");
int w = lua_tointeger(L, -1);
lua_pop(L, 1);
printf("w = %d\n", w);
lua_close(L);
}
こんどは C/C++から Luaにグローバル変数を登録してそれを Luaで表示させるとうことをやってみましょう。
グローバル変数の取得は lua_getglobal→lua_tonumberという順番ですが、設定する場合は値をlua_pushXXXで値をプッシュしてからlua_setglobalを呼び出します。
#include
#include
#include "PrintStack.h"
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
constexpr int MAX_SHOP_ITEMS = 5;
lua_pushnumber(L, MAX_SHOP_ITEMS);
lua_setglobal(L, "MAX_SHOP_ITEMS");
if (luaL_dofile(L, "sample.lua") != LUA_OK) {
printf("error:%s\n", lua_tostring(L, -1));
lua_close(L);
return -1;
}
lua_close(L);
}
続いて C/C++から Luaの関数を呼ぶ例です。 Luaで定義したadd関数を呼び出すには
- lua_getglobal関数を使って add関数をスタックに積む
- lua_pushXXXで引数に渡す
- lua_pcallを使ってLuaの関数を呼び出す
- lua_toXXXXで引数を取得す
以下がC/C++のプログラムです。
#include
#include
#include "PrintStack.h"
int main()
{
// Luaの初期化
lua_State *L = luaL_newstate();
luaL_openlibs(L);
// ファイルを読み込む
if (luaL_dofile(L, "sample.lua") != LUA_OK) {
printf("error:%s\n", lua_tostring(L, -1));
lua_close(L);
return -1;
}
// add 関数を積む
lua_getglobal(L, "add");
// 引数は2個
lua_pushinteger(L, 10);
lua_pushinteger(L, 20);
// Luaの関数を呼ぶ(引数:2個、戻り値:1個)
if (lua_pcall(L, 2, 1, 0) != LUA_OK) {
printf("error:%s\n", lua_tostring(L, -1));
lua_close(L);
return -1;
}
// 結果を表示
printf("%d\n", lua_tointeger(L, -1));
lua_close(L);
}
Luaから二つの引数を取りC言語の関数を呼び出して4つ返す関数です。以下のポイントがあります。
- LuaからC言語の関数を実行するには int型を戻り値として、引数としてlua_State構造体のポインターにする
- Luaのスタックから lua_toXXX関数を使って引数を取得
- 引数をスタックを lua_settop(L, 0); として空っぽにする
- 目的の関数を実行
- 結果を Luaのスタックにプッシュする
- return 文は戻り値の数を指定する
#include
#include
int add_c(int x, int y) {
return x + y;
}
int sub_c(int x, int y) {
return x - y;
}
int mul_c(int x, int y) {
return x * y;
}
int div_c(int x, int y) {
return x / y;
}
int multiply(lua_State* L) {
int x = lua_tointeger(L, 1);
int y = lua_tointeger(L, 2);
lua_settop(L, 0);
int add_ret = add_c(x, y);
int sub_ret = sub_c(x, y);
int mul_ret = mul_c(x, y);
int div_ret = div_c(x, y);
lua_pushinteger(L, add_ret);
lua_pushinteger(L, sub_ret);
lua_pushinteger(L, mul_ret);
lua_pushinteger(L, div_ret);
return 4;
}
int main()
{
lua_State *L = luaL_newstate();
luaL_openlibs(L);
lua_register(L, "multiply", multiply);
if (luaL_dofile(L, "sample.lua") != LUA_OK) {
printf("error:%s\n", lua_tostring(L, -1));
lua_close(L);
return 0;
}
lua_close(L);
}