Skip to content
Toru Hisai edited this page Aug 25, 2012 · 16 revisions

Visual C++ と Xcode

まずは Visual C++ か Xcode のプロジェクトに取り込む方法を示す。

基本的には、単にソースコードをプロジェクトに足し、本体のプログラムのどこかで Lua のインタプリタを作成して初期化するだけである。

Visual C++

  • スクリーンショット

Lua のソースコード一式を、プロジェクトに足す。 .c のサフィックスのついたファイルはソースファイルとして、 .h のサフィックスのついたファイルはヘッダファイルとして足せば良い。 ただし、main 関数を含む lua.c、luac.c だけは、 ここでは必要ないので除外する。

main 関数

  • ヘッダファイルのインクルード
  • lua_Stete の作成
  • ライブラリのロード
  • スクリプトを文字列として渡して評価する

Xcode

  • Visual C++ と同じ。

C API とスタック

スタック

C と Lua の間で関数を呼び出すとき、必要な情報は、 スタックを使って受け渡しする。

  • スタックの絵

関数と引数をスタックに積む。

関数を見つけるためには、関数名などをスタックに積んで、 環境テーブルから名前を引く。

この状態で、lua_call を呼び出す。lua_call のシグネチャは、

void lua_call (lua_State *L, int nargs, int nresults);

となっていて、nargs は引数の数、nresults は期待する戻り値の数である。呼び出し側が戻り値の数を指定することに注意すること。

print "Hello Lua!" に相当する関数呼び出しをする。

  • "Hello Lua!" という文字列をスタックに積む
  • "print" という文字列をスタックに積む
  • print というシンボルを引く
  • lua_call を呼び出す

返り値の受け取り

Lua 関数からの戻り値は、再びスタックに積まれる。いくつの値を戻すかは、呼び出し側が決めることになっているので、スタックに積まれたデータの数が期待と異なることはない。また、関数が実際に返した値の数と、この期待する返り値の数が異なっていた場合は、多値の代入と同じように 調整 が行われる。 [http://www.lua.org/manual/5.2/manual.html#3.3.3]

エラー処理

Lua の関数の実行中にエラーが発生したときに、そのエラーを C 側で捕捉するには lua_pcall という関数を使う。

int lua_pcall (lua_State *L, int nargs, int nresults, int msgh);

nargsnresults の意味は lua_pcall と同じで、最後の引数として msgh という値をとるところが違う。この引数には、エラーメッセージを処理する関数のインデックスを指定することができるが、特に特別な処理をする必要がなくて単にエラーが捕捉できさえすれば良いという場合は 0 を指定する。

また lua_call は値を返さないのに比べ、lua_pcall は正常に関数が実行されれば 0 を、途中でエラーが発生すれば 0 以外の値を返す。エラーが発生して 0 以外の値を返すときには、同時にスタックのトップにエラーメッセージもプッシュするので、C の呼び出し側はこのメッセージを読み取れば良い。

msgh の正確な意味と、lua_pcall の返り値の意味について詳しくはマニュアルを参照すること。 http://www.lua.org/manual/5.2/manual.html#lua_pcall

Clone this wiki locally