Luaプログラミング入門 > 第8章 C言語との連携 > CからLuaを呼び出す > Lua関数を呼び出す


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

Lua関数を呼び出す 応援する 

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関数は関数の呼び出しに失敗するとエラーコードをスタックに積みます.


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation