問題タブ [lua-api]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - C-API で lua_Buffer を "%q" フォーマットする方法
string.format ("%q", foo_str) は、文字列をフォーマットして適切なエスケープ文字を追加し、Lua インタープリターに安全に読み戻せるようにします。この関数を使用して C-API から Lua_Buffer をフォーマットするにはどうすればよいですか? より一般的には、C-API から string.* 関数にアクセスするにはどうすればよいですか? lua_pcall ("string.format", ...) を使用することもできますが、もっと直接的な方法があるかどうか知りたいです。
c - 同時に 2 つの Lua バッファーを初期化して操作できますか?
LuaL_Buffer オブジェクトが「通常の操作中、文字列バッファーは可変数のスタック スロットを使用する」とすると、2 つの luaL_Buffer オブジェクトを同時に使用する方法がわかりません。彼らはそれぞれ、スタックの状態が要求どおりであると想定しますか? 言い換えれば、あるバッファがスタックの一番上に何かを置き、将来の呼び出しでそこにあると期待しているのに、別のバッファにも同じことが当てはまりますか? 2 つの LuaL_Buffer を同時に操作することはできませんか?
同時に 2 つのバッファーを必要とする操作の例を次に示します。小規模なテストでは機能するようですが、本番環境で機能するかどうかはわかりません。
zlibメソッドmy_uncompress
のラッパーはどこですか
lua - 「弱い Lua レジストリ」を探している
これらの参照が弱く、いつでもガベージ コレクションされる可能性があることを除いて、C が参照システムを使用するのと同じ方法で Lua 5.2 のオブジェクトを参照する方法はありますか? 言い換えれば、オブジェクトの参照カウントに影響を与えない、現在のすべての Lua オブジェクトのレジストリはありますか?
lua - WoW lua APIの主要なソース?
WorldofWarcraftアドオンAPIに関する直接の情報を探していました。かなり良いウィキがいくつかありますが、それらの参照リンクは内部を指しているだけです。確かに、このトピックに関してBlizzardによって公開されたいくつかの情報があります。
彼らのすべての情報は、リバースエンジニアリングやフォーラムから本当に収集できますか?それは私には信じがたいことです。
lua - luaが埋め込まれたCコードからスタックトレースを出力する
私がこれを正しく理解していれば、エラーが発生したときに、Luaはデフォルトでデバッグライブラリを「debug.traceback」と呼びます。
ただし、次の例のようにLuaをCコードに埋め込む場合: 単純なLuaAPIの例
スタックの一番上にあるエラーメッセージのみを利用できます。
すなわち
初期エラーの後にCからスタックトレースを出力するにはどうすればよいですか?
lua - luaL_refとluaL_unrefで変更されたテーブルを反復処理するにはどうすればよいですか?
LuaのCAPIを使用してLuaを拡張しています。私のモジュールでは、を使用してテーブルにデータを入力し、を使用しluaL_ref
てフィールドを削除したいと思いますluaL_unref
。また、できればを使用して、このテーブルを反復処理できるようにしたいと思いますlua_next
。
テーブルの反復は、のために問題になりluaL_unref
ます。Luaでは、割り当てることによってテーブルフィールドを「削除」するのが一般的ですnil
(初期化されていないテーブルフィールドはに評価されるためnil
)。このnext
関数は、スキップするのに十分スマートnil
です。luaL_unref
参照されていないテーブルフィールドに割り当てることを期待しnil
ていましたが、整数を割り当てているようです。この整数の値は文書化されていないようです。
次のコードを検討してください。
出力:
何が起きてる?どうすればこれを回避できますか?参照を繰り返し処理し、参照されていないものを無視するためのトリックはありますか?との使用をやめる必要がluaL_ref
ありluaL_unref
ますか?
編集
まず、ご回答ありがとうございます!
多分私は間違った質問をしました。
もう少し具体的にさせてください。多くのサブスクリプションユーザーデータを管理する必要があるクライアントユーザーデータがあります。サブスクリプションは、クライアントのサブスクライブ方法によって作成されます。サブスクリプションは、クライアントのサブスクリプション解除方法によって削除されます。サブスクリプションのユーザーデータは基本的に実装の詳細であるため、クライアントAPIでは公開されません。代わりに、クライアントAPIはサブスクリプション参照を使用するため、を使用しluaL_ref
てサブスクリプションテーブルにデータを入力します。
これがキャッチです。クライアントが__gcの残りのすべてのサブスクリプションを自動的にサブスクリプション解除するようにします(そうしないと、ユーザーはセグメンテーション違反になります)。したがって、サブスクリプションを繰り返す必要があるようです。私は本当にここでAPIを悪用していますか?これを行うためのより良い方法はありますか?
c++ - C api での lua テーブルの移動
lua C API を使用してテーブルを別のテーブルに移動しようとしています。たとえば、次の構造のテーブルがあります。
テーブル d this を a[b] の下に移動したいのですが、これは Lua で次のように実行できます。
私の現在のアプローチは、スタックに a[b][c][d] テーブルをロードすることなので、スタックは次のようになります。
次に a[b] をスタックにロードすると、次のようになります。
次に、d のキーをスタックに置き、d のキーとテーブル b をテーブル d の下に挿入すると、スタックは次のようになります。
次に lua_settable(L, -3) を使用して b[d] = d を実行します。
このアプローチは、テーブル以外のキーに対しては機能しますが、テーブルであるキーに対しては失敗します。したがって、次のような場合は失敗します。
キーが新しいluaテーブルになるため、上記のluaでは失敗することがわかっています。説明したかっただけです。
私はテーブルの親を下ってみました (a[b] = b, lua_setglobal(L, a) を実行します) 運もありません。ここで私がどこで間違っているのか誰か知っていますか?
編集: キー/値をスタックにプッシュする方法に関する小さなコード スニペット。ここでの目標は、テーブルをあるテーブル構造から別のテーブル構造に移動することです (または、コードで呼び出しているように、親を変更します)。
解決:
問題は、テーブルの変更を妨げるメタテーブル機能がテーブルにあることでした (本質的に、スクリプトを作成した人は、構造が重要な構成テーブルを持っていたため、この問題が発生しました)。
c++ - Lua C API: テーブル要素を挿入すると、Debug Assertion Failed が発生する
関数は正常に戻り、テーブルの値を使用できますが、「Debug Assertion Failed」というエラーが表示されて終了します。assert の問題が for ループにあることは知っていますが、それを修正する方法が正確にはわかりません。前もって感謝します。
編集: int i; を設定すると 0 では機能しますが、最後の要素を忘れます。i == 1 ではないのはなぜですか?
lua_rawseti(L,-2,i); の場合、失敗したアサーションが表示されます。そして私== 1
私の問題を解決する解決策がないため、これら 2 つのケースで何が行われ、どのような出力が得られるかを説明しようと思います。xml ファイルで指定されたノードからすべての値を取得したいだけです。
スクリプトは次のようになります。
問題:
int i = 1;
出力:
A B C D !!!デバッグ アサーションが失敗しました!!!
-------------------------------------------------- ----
int i = 0;
出力:
B C D エラーなし...
lua - c-api を使用して Lua テーブルの値を修正する
luaのテーブルは次のように定義されています
Lua が ac 関数を呼び出し、タブ テーブルがパラメーターとして設定されている場合、この c 関数は更新後にテーブルを返す必要があります
すべての文字列値を修正して「DEFAULT」に設定し、修正後のテーブルを lua に返したいと思います。
Cコード
ルアコード
結果
文字列値にはまだ初期値がありますが、デフォルトで「DEFAULT」に設定されているはずです
c - Lua C API - プロパティを関数にマッピングする
関数をLuaのプロパティとしてプッシュすることは可能ですか?
現在、次のようにフィールドとしてプッシュすることで、Get/Set 関数を使用できます。
そして、Lua で次のように呼び出します。
メタテーブルなしで C 関数にマップされたプロパティをプッシュすることは可能ですか? カスタム関数にメタテーブルでマッピングできましたが、もっと簡単な方法があるかどうか疑問に思っていまし__index
た。__newindex
最終的に、メタテーブルのない次の構文が必要です。
これは と なし__index
で可能__newindex
ですか?