1. ホーム
  2. スクリプト・コラム
  3. ルア

LuaでC++の関数を呼び出す例

2022-01-09 19:08:14

LuaはもちろんC言語で定義された関数を呼び出すこともできます。平均化の例を説明します。
以下に示すC++の関数average()は、複数の引数を受け取り、複数の値を返す方法を示しています。
1. lua_gettop関数は、スタックの先頭のインデックス値を返します。Lua ではスタックの番号は 1 から始まるので、この関数で得られる値は引数の数だけあることになります。

2. forループ内の全引数の合計を計算する。
3. lua_pushnumber()を呼び出し、引数の平均値をスタックします。 
4. 最後に、この関数は 1 を返し、スタックに戻り値があることを示します。
C++の関数が定義されたので、それをLuaインタープリタに伝える必要があります。これは、Luaインタープリタが初期化され、ロードされたライブラリが関数の登録を完了した後、main関数内で行います。

コピーコード コードは以下の通りです。

lua_register(L, "avg", average); //the second argument is the name of the function called in Lua 

C++側です。

#include "stdafx.h" 
#include <stdio.h> 
 
extern "C" { //if you don't use extern you will get a link error and compile to a C++ file 
#include <lua.h> 
#include <lualib.h> 
#include <luxlib.h> 
} 
 
int average(lua_State *L){ 
 int n= lua_gettop(L); 
 int i; 
 double sum=0; 
 for(i=0;i<n;i++){ 
  sum+=lua_tonumber(L,-1); 
  lua_pop(L,1); 
 } 
 lua_pushnumber(L,sum/n); 
 if(!lua_isnumber(L,-1)) 
  luaL_error(L,"push error!\n"); 
 return 1; 
} 
 
int _tmain(int argc, _TCHAR* argv[]) 
{ 
 lua_State* L = lua_open(); 
 luaL_openlibs(L); // methods added by the new version of the library 
 
 lua_register(L,"avg",average); 
 luaL_dofile(L,"cof.lua"); 
 
 getchar(); 
 return 0; 
} 


Luaファイルです。

コピーコード コードは以下の通りです。

print("avg is ",avg(1,2,3,4,5,6,7,8)) 

平均値を求めるプログラムを実行します