1

lua c api を使用して、グローバル名前空間とそのすべてのコンテンツをクロールしようとしています。私が直面している問題の 1 つは、表での自己参照です。エントリが存在するかどうかを判断するために平坦化されたテーブル アプローチを使用していましたが、次のようなネストされた数値テーブルでは失敗します。

a = {[1] = {[1]={[1]=true}}}

1 のキー名は、複数回発生するため、重複エントリを false トリガーします。これを回避するために、 lua_topointer を使用して参照をマッピングに保存し、これを次のようにチェックするというアプローチを採用しました (varUnit は、ロードされた変数を追跡するための単なる構造です)。

    lua_pushvalue(L, -1);
    const void* kp = lua_topointer(L, -1);
    var->kpointer = kp;
    varUnit->addPointer(kp);
    lua_pop(L, 1);
    lua_pushvalue(L, -2);
    const void* vp = lua_topointer(L, -1);
    var->vpointer = vp;
    varUnit->addPointer(vp);
    lua_pop(L, 1);

次に、その変数が存在するかどうかを後で確認し、存在する場合は、テーブルを下るのをやめます。ただし、これは、自己参照テーブルを処理する際の無限再帰を停止していません。ここでより良いアプローチ/いくつかの欠陥のあるロジックはありますか? 特定のテーブルに 2 度目に遭遇すると、別のポインターが表示されますか? テーブルをクロールする複数の lua ベースの方法を見てきましたが、c ベースではありません。

編集:閉じられた質問は、ポインターを変数に割り当てる前に、ポインターが重複していることを確認していたばかげた間違いでした。

4

1 に答える 1

0

「フラット化されたテーブルアプローチを使用する」という意味がわかりません。ただし、コードのどこかで、指定された値がテーブルであるかどうかを確認する必要があります (そのため、その内部を確認できます)。最も簡単な方法は、既にアクセスしたすべてのテーブルのセットを保持することです。見つかったテーブルについては、最初にそれが既に存在するかどうかを確認して、2 回クロールしないようにします。

于 2013-06-26T14:33:21.713 に答える