blog

例で学ぶLua言語(6)-C/C++でLua関数を使う

今回は、Luaで関数を定義し、CやC++で呼び出す方法について説明します。 ここでは、C++のオブジェクトの問題には触れず、パラメータ、戻り値、グローバル変数についてのみ説明します。...

Mar 24, 2025 · 4 min. read
シェア

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++でそれを呼び出します。

Read next

ハッカー集団アノニマスが新しい無線通信ツールを開発している

全米ナンバーワンのハッカー集団であるアノニマスは最近、携帯電話やインターネットを使わずに無線通信技術を使って通信できる新しい通信ツール「エアチャット」を開発中であると発表しました。

Mar 24, 2025 · 2 min read