5

開発中の C++ アプリケーションに Lua を埋め込むことを考えています。私の意図は、Luaを使用して、特定の入力に対して実行する命令操作をスクリプト化することです。c++ プログラムで新しい作業項目を受け取り、詳細を Lua バックエンドに渡し、必要な作業を実行するために Lua が c++ にコールバックし、完成した結果を返します。

関連する主要なデータ構造は大規模です (約 80 以上のメンバー) struct。私は Lua に (非常に) 慣れていないので、ホスト アプリケーションと埋め込まれた Lua 状態との間でどのように受け渡しできるかわかりません。

これまでのところ、私のオプションは次のように見えます。

a) C++ と Lua との間を行き来するときに、すべての個々のデータ メンバーをスタックにプッシュ/ポップします (面倒に聞こえます)。

b) テーブルを作成して値を入力し、それをスタックにオン/オフします (少しクリーン)。

c)(軽い/重い?)として渡しuserdataます(これについては大ざっぱで、必要な操作を照会するためにLua側からアクセスできるかどうか/どのようにアクセスできるかわかりません)。

ガイダンスをいただければ幸いです。

4

4 に答える 4

4

私の記憶が正しければ、軽いユーザーデータは実際には単なるポインタです。それらはすべて同じメタテーブルを共有します。ほとんどの場合、C データのアドレスを渡すために使用されます。
Lua 側からアクセスする必要がある場合は、完全なユーザーデータの方がおそらく必要なものに近いでしょう。それらのメタテーブルを使用すると、たとえば、通常の Lua テーブルのようにアクセスできます。

Lua 5.1 の C 構造体との間でデータを変換するための Roberto のライブラリにも興味があるかもしれません。か否か。あなたのニーズに依存します... :-)

于 2008-11-12T11:00:48.077 に答える
3

私はこれを自分で行ったことはありません (Lua を使用してから何年も経ちますが、組み込みの方法で使用したことはありません) が、メタテーブルとユーザーデータ型を調べる必要があると思います。マニュアルには、ユーザーデータ値について次のように記載されています。

このタイプは生メモリのブロックに対応し、代入とアイデンティティ テストを除いて、Lua には定義済みの操作はありません。ただし、メタテーブルを使用することにより、プログラマーはユーザーデータ値の操作を定義できます (§2.8 を参照)。ユーザーデータ値は Lua で作成または変更できません。C API を介してのみ使用できます。

ほぼ正しいように聞こえます。

于 2008-11-12T07:33:09.463 に答える
1

表現全体を Lua に公開することは、あなたが望むものではないかもしれません。たぶん、いくつかの操作のみを公開していますか? 次に、構造体へのポインターをライト ユーザーデータとして使用します。メタテーブルを持つことはできないため、明示的な関数を使用する必要があります。

すべてを公開したい場合は、構造体へのポインターのみを含む完全なユーザーデータをプッシュするのが最善の策です。これは余分なレベルの間接性を意味します--- パフォーマンスの観点からはノイズの中で失われますが、間違いを犯しやすいため、C++/Lua の境界を越える場所では単一の真実を維持してください。

完全なユーザーデータを使用すると、マクロ (恐ろしい!) を使用して、各フィールドにゲッター関数とセッター関数を配置できます。これは手作業で行う作業が多く、荷物が多くても tolua++ を試してみた方がよいかもしれません。

Lua メーリング リストにアクセスしてください。

于 2008-11-28T21:02:15.437 に答える
0

私なら、構造体への参照を渡し、Lua に C 関数を呼び出してそれを変更させます。これはまた、Lua が基礎となるシステムのすべての詳細を知る必要がある場合よりも手間をかけずにシステムをアップグレードできることを意味します。

于 2009-07-22T05:57:49.710 に答える