関数に渡すテーブルは、関数のスタック上にあります。 lua_getfield
またはlua_gettable
を使用してインデックスを作成できます。
lua_next
を使用してテーブルをトラバースする場合は、必要に応じてCで配列を設定できます。配列の場合は、1から#t
までの繰り返しで十分です。
いくつかの例ユーティリティコード(未テスト):
int* checkarray_double(lua_State *L, int narg, int *len_out) {
luaL_checktype(L, narg, LUA_TTABLE);
int len = lua_objlen(L, narg);
*len_out = len;
double *buff = (double*)malloc(len*sizeof(double));
for(int i = 0; i < len; i++) {
lua_pushinteger(L, i+1);
lua_gettable(L, -2);
if(lua_isnumber(L, -1)) {
buff[i] = lua_tonumber(L, -1);
} else {
lua_pushfstring(L,
strcat(
strcat(
"invalid entry #%d in array argument #%d (expected number, got ",
luaL_typename(L, -1)
),
")"
),
i, narg
);
lua_error(L);
}
lua_pop(L, 1);
}
return buff;
}
私はCに触れ、またLuaのCのAPI、looonngg時間のためにしていません。もし私がコードを間違えてしまったら、誰か修正してもらえますか? – Deco
Decoとjpjacobsをお手伝いしてくれてありがとうございますが、私は疑いがあります...仮想スタックをCプログラムに渡すとき、どうすればそれを受け取ることができますか? lua_gettableを使用したい場合、インデックス値は何ですか?私はインデックス値のために何を使うべきか確信しています。私はluaプログラムのテーブルxをCに渡しました。lua_gettopで取得できる長さはわかりませんが、lua_gettableでどのインデックスを使用すればいいですか。このテーブルをどのタイプの変数に格納するべきですか?私はそれに疑問を持っている。申し訳ありませんが、私はルアの新しいですので、私と一緒にご負担ください。もう一度お返事いただきありがとうございます..... :) – Rahul
"Lua"のスタックプッシュ操作とポップ操作が説明されている良いサイトのリンクを私に提供できますか?私はここでlua_pop(L、1)を行った理由を知ることができません。私はそれを試して、これで動作したが、私はスタックから要素をポップすると思う、私たちはトップを飛び出す必要があるので、ここではlua_pop(L、-1)だったはずです。しかし、なぜそれが "1"であるのですか?私のコードが動作し始め、スタックインデックスの概念を一番上に置き、lua_gettableを使用していますが、私たちがなぜpopを1として使用しているのか理解できませんでした。それはすべての人に役立つだろう。 – Rahul