ページ 11

luaにて、C/C++のグルー関数から配列を返す方法

Posted: 2014年7月10日(木) 17:32
by dic
件名のとおり、C/C++のグルー関数から呼び出し元である
luaに配列を返す方法でつまづいています。

いま、キーボードの状態を取得する関数

コード:

void GetHitKeyStateAll_(); と、そのグルー関数
int GetHitKeyStateAll_Glue( lua_State *L ); のふたつを実装しました。
そして、luaスクリプトから、このグルー関数を呼び出して、現在のキーボードの
状態を取得できないか、試しているところですが、うまくいきません。

luaスクリプトは

コード:

--	sub[] = GetHitKeyStateAll_();
	for i = 1, 256 do
		if sub[i] == 1 then
--			DrawString_( 100, 120, "ON", 128,128,128 );
		end
	end

となっており、コメントをはずすとアクセス違反が起きてしまいます。


C/C++のグルー関数と、中身の関数を載せます。

コード:

//==================================================================
void	GetHitKeyStateAll_( char *buf )
{
	GetHitKeyStateAll( buf );
}
int		GetHitKeyStateAll_Glue( lua_State *L )
{
	//	引数を取得
	
	//	目的の関数を実行
	char	buf[256];
	GetHitKeyStateAll_( buf );

	int	i;
	for( i=0; i<256; i++ )
		lua_pushnumber( L, buf[i] );

	//	戻り値の数(256)
	return 256;
}

期待していることは、luaスクリプトで、GetHitKeyStateAll_() を呼び出したら
キーボードの状態が、配列の状態で戻り値として受け取ることです。
そして

コード:

input[] = GetHitKeyStateAll_();
if input[KEY_INPUT_F1] == 1 then ... end
というふうに入力の状態でわけて処理できるようにしたいです。


値を複数返す方法はわかったのですが、配列を返す方法がなかなか
みつかりません。どうやったらいいのでしょうか?

Re: luaにて、C/C++のグルー関数から配列を返す方法

Posted: 2014年7月10日(木) 21:01
by dic
GetHitKeyState_() 関数をひとつずつ値を返すように変更してうまくいきました。

あと、luaのスタックサイズは20くらいで、256個もないようでした(汗
20以上の場合、スタックを確保する方法

コード:

	if( lua_checkstack(L, 300) == 0 ) {
        OutputDebugString("スタックの容量が確保できませんでした\n");
        return 1;
    }
と、メモしておきます。


解決しました。

Re: luaにて、C/C++のグルー関数から配列を返す方法

Posted: 2014年7月10日(木) 21:28
by ookami
一足遅かったw
CからLuaスタックのテーブルを操作する方法です。ご参考まで。
http://karetta.jp/book-node/lua/228937

Re: luaにて、C/C++のグルー関数から配列を返す方法

Posted: 2014年7月11日(金) 02:26
by dic
>>ookamiさん
回答ありがとうございます。
ただ、猛スピードでluaが進んでいるので、もうすこし落ち着いたら読もうかと思います。
頭が追いつきませんw(嬉泣
オフトピック
ookamiさんが作られている某ソフト バージョンアップ楽しみにしてます。
(多分)独自のシステムで実装されるので、そのシステムの解説があるといいんじゃないかなと思ってます。