3

私はこのボイラープレートの例に従いました: http://www.matrix44.net/blog/?p=456

C から Lua に文字列を送信できますが、構造体を渡すとエラーが発生します (lua_newuserdata を使用しました)。

C中略

//s = (ST*) malloc ( sizeof(ST) );
//    lua_pushlightuserdata(state, s);
s = lua_newuserdata(state, sizeof(ST));
s->a=11;
s->b=12;
printf ( "s = %p \n", s ); // Prints 0x80a708
result = lua_pcall(state, 0, LUA_MULTRET, 0);

ルア・スニップ

print(foo)  -->  Prints 0x80a708
io.write("received has:\n", foo.a); --> ERROR : Failed to run script: script.lua:1: attempt to index global 'foo' (a userdata value)

バッファを構造体/テーブルレコードにキャストするにはどうすればよいですか?

最終的に、私の C プログラムは構造体を認識せず、バッファを Lua に渡すだけであり、Lua は構造体を認識しており、そこにキャストする必要があります。

PS : スクリプトと C プログラムの両方の printf が一致します (0x80a708)。キャストできますか??

4

3 に答える 3

5

Lua には構造体がなく、テーブルがあります。

Userdata は不透明なデータを Lua に渡す便利な方法ですが、Lua は内部を見ることができません。ユーザーデータは、それを C++ に戻し、それが何であるかを判断する方法がある場合にのみ役立ちます (基本的に正しい型にキャストします)。

Lua テーブルは、C++ の構造体に最も近いものです。次のように書くことができます。

lua_newtable(state);
lua_pushnumber(state, s->a);
lua_setfield(state, -2, "a");
lua_pushnumber(state, s->b);
lua_setfield(state, -2, "b");

これで、lua で参照できるようになりました。

print(foo.a); -- this will now print 11
于 2013-03-14T01:40:48.933 に答える
2

ユーザーデータの内部にはLuaコードからアクセスできません。
CからLuaに構造体を渡すためのテーブルを使用します。
または、メタテーブルを使用してユーザーデータのインデックスを手動で定義します。

于 2013-03-13T21:09:50.857 に答える
0

解決済み:luajitを使用して、バッファーを渡し、lua側のC構造体にキャストすることができました。

于 2013-03-20T18:42:47.413 に答える