LuaからC言語の中に定義した構造体や定数を使う

tolua++が強力なのは構造体や定数もLua側に取り込んでくれることです。

どういうことかというと、

xxx = 構造体.メンバ
yyy = C言語の中の定数

といったような、C言語と結びついたLuaコードを書くことができます。

ポイントは一点だけ。構造体にはインスタンスを作ってくれる関数を提供しないといけません。



以前の例に定数と構造体を足して見ます。

まずはヘッダファイル。

[ファイル:cfunc.h]

#ifndef __CFUNC_H__
#define __CFUNC_H__

typedef struct {
	int x;
	int y;
} Param;

#define CST 100
//インスタンス生成用の関数、ポインタでなく、実体を返す
//実体返しをすると、Luaでメモリ管理
extern Param new_instance();
extern int hello( Param p );

#endif // end of __CFUNC_H__



次にCファイル

ファイル:cfunc.c

#include <stdio.h>
#include <stdlib.h>
#include "cfunc.h"

Param new_instance()
{
	Param *p = malloc( sizeof(Param) );
	return (*p);
}

int hello( Param p )
{
	printf( "hello x=%d y=%d\n" , p.x , p.y  );
	return ( p.x + p.y );
}



で、tolua++の場合はpkgファイルを作って、グルーコードを生成するのでしたね。



ファイル:cfunc.pkg

typedef struct {
	int x;
	int y;
} Param;

#define CST 100

extern Param new_instance();
extern int hello( Param p );



これで以前のようにビルドします。

で、Luaのコードですが、

require( "cfunc" )
--new_instance()関数でインスタンスを生成
param = new_instance();
--これで構造体は普通にアクセスできる
param.x = 10
param.y = 20
hello( param )
--定数もアクセスできる
print( CST )