C言語側からLuaの関数を呼び出してみましょう.
次のようなadd関数をLuaで作成したとします.
ファイル名はsample.luaです.
--sample.lua
function add(x, y)
print("x : ".. x .. " y : " .. y .. "を受け取りました")
return x + y
end
add関数は二つの引数x,yを受け取り,その合計値を返却します.
ではC言語側のサンプルコードをお見せします.
#include <stdio.h>
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
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;
}
//add関数をスタックに積む
lua_getglobal(L, "add");
//第1引数x
lua_pushnumber(L, x);
//第2引数y
lua_pushnumber(L, y);
//add(x, y)を呼び出す 引数2個,戻り値1個
if(lua_pcall(L, 2, 1, 0) != 0) {
printf("関数呼び出し失敗\n");
printf("error : %s\n", lua_tostring(L, -1) );
return 1;
}
if( lua_isnumber(L, -1) ) {
printf("結果 : %d\n", lua_tointeger(L, -1) );
lua_pop(L,1); //戻り値をポップ
}
lua_close(L);
return 0;
}
実行結果
x : 10 y : 5を受け取りました
結果 : 15
ここで登場した関数がlua_pcall関数です(下図).
この関数は次のように定義されています.
lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);
nargsには関数に渡す引数の数を,nresultsは関数から受け取る戻り値の数を
指定します.errfuncは通常は0のままでかまいません.
さて,関数を呼ぶには次のような手順が必要です.
まず,始めに呼び出したい関数を取得しスタックに積みます.
次にその関数に渡す引数を順番どおりに積んでいきます.
つまり第1引数は一番初めにプッシュしなければなりません.
そしてlua_pcallを呼び出すとその関数を実行します.
関数を呼び出した後は,スタックに積まれていた関数,及び引数はスタック上から削除されます.
関数からの戻り値がある場合は戻り値の順番どおり,つまり最初の戻り値は最初にスタックに積まれていきます.
また,lua_pcall関数は関数の呼び出しに失敗するとエラーコードをスタックに積みます.