1.はじめに
今回はLuaで関数を定義し、それをCやC++で呼び出す方法を取り上げます。 C++のオブジェクトについては触れず、パラメータ、戻り値、グローバル変数についてだけ説明します。
2.
ここではe12.luaで単純なadd()を定義します。x,yは足し算の2つのパラメータで、returnは足し算の結果を直接返します。
例 e12.lua
-- add two numbers
function add ( x, y )
return x + y 終了
前回、C言語でluaファイルを直接実行する方法としてlua_dofile()について説明しました。 今回のアプリケーションではadd()関数を定義しているだけなので、アプリケーションの実行は直接の結果にはなりませんが、C言語で関数を定義しているのと同じことになります。
Luaの関数は複数の引数と複数の戻り値を持つことができ、それらはスタック上に実装されます。関数を呼び出す必要がある場合、関数をスタックに押し、次にすべての引数を順番に押し、lua_call()で関数を呼び出します。 関数が戻ってくると、戻り値もスタックに格納されます。 この処理は、関数呼び出しを実行するアセンブリ処理と同じです。
例 e13.cpp は、上記の Lua 関数を呼び出す例です。
#include
extern "C" { // これはC++程序, 所以要extern "C",
// 因为 lua的头文件都是C格式的
#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"
}
/* the Lua interpreter */
lua_State* L;
int luaadd ( int x, int y )
{
int 合計;
/* the function name */
lua_getglobal(L, "add");
/* the first argument */
lua_pushnumber(L, x);
/* the second argument */
lua_pushnumber(L, y);
/* call the function with 2
引数, return 1 result */
lua_call(L, 2, 1);
/* get the result */
合計 = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
return sum;
}
int main ( int argc, char *argv[] )
{
int sum;
/* initialize Lua */
L = lua_open();
/* load Lua base libraries */
lua_baselibopen(L);
/* load the script */
lua_dofile(L, "e12.lua");
/* call the add function */
sum = luaadd( 10, 15 );
/* print the result */
printf( "The sum is %d
", sum );
/* cleanup Lua */
lua_close(L);
return 0;
}
手続きの説明
メインの処理についてはすでに説明したので、今回はluaaddの処理についてだけ説明します。
* :: 最初に add 関数を lua_getglobal() でスタックします。
* 次に lua_pushnumber() で x,y を順番にスタックします。
* 次に lua_call() を呼び出し、2つの引数と戻り値があることをプログラムに伝えます。
* :: 次に、lua_tonumber()を使ってスタックの一番上から戻り値を取り出します。
*** lua_pop()で戻り値を消去することもできます。
結果
合計25
コンパイル方法
Linuxでのe13.cppとしてのプログラムの保存
g++ e13.cpp -llua -llualib -o e13
./e13
VCでのコンパイル方法
* :: まず、空の Win32 コンソール・アプリケーション・プロジェクトを作成します。
* :: e13.cppをプロジェクトに追加
* コンピレーション
このプロジェクトはこちらからダウンロードできます。
VC http://.//.ip
Linux http://.//..gz
3.グローバル変数
上ではlua_getglobal()を使いましたが、詳しく説明しなかったので、ここではグローバル変数の例をもう2つ紹介します。
lua_getglobal()が行うのは、luaのグローバル変数の値をスタックに押し出すことです。
lua_getglobal(L, "z").
z = lua_tonumber(L, 1);
lua_pop(L, 1)。
Luaプログラムがグローバル変数zを定義していると仮定すると、このアプレットはzの値を受け取り、Cの変数zに入れます。
また、Luaにも同等のlua_setglobal()があり、指定したグローバル変数にスタックの先頭の値を代入します。
lua_pushnumber(L, 10);
lua_setglobal(L, "z").
例えば、このアプレットはluaのグローバル変数zを10に設定します。
グローバル変数 z を 10 に設定。
4.お試しください。
独自の関数を作成し、C/C++でそれを呼び出します。