1

私は小さなLuaバインディング ライブラリを書いています。現在、キー/値を保持するための非常に単純な構造体を提供しています。ここで、 myvaluevoid pointerです。

struct kvPair {
       enum EVENT_TYPE type;
       char *key;
       void *value;
   };

typedef struct kvPair KeyValuePair;

KeyValuePair kvPairWithNumber(char *key, float number)
{
    KeyValuePair kv;
    float *aux = malloc(sizeof(float)); // <-- help
    *aux = number;
    kv.key = key;
    kv.type = NUMBER;
    kv.value = aux;
    return kv;
}

この種のユースケースについて疑問に思っていました... malloc を処理する良い方法は何でしょうか? 私は本当にやりたくない:

if (aux == NULL) {
    exit(0);
}

おそらく、メモリのブロックを事前に割り当てて、malloc 呼び出しを独自のより単純な実装 (単純なスタックを使用したカスタム メモリ アロケータ?) でオーバーライドすることができます。

フィードバックと例を受け取りたいのですが、シンプルさが望ましいです。

4

1 に答える 1

1

あなたは間違いなく終了したくありません。スクリプトや拡張機能によってインタープリター全体がクラッシュすることはありません。

エラーを表現するには、基本的に 2 つの方法があります。最初の方法は、C API によって提供されるlua_errorまたはluaL_errorを使用することです。2 番目の方法はポリシーに近いもので、戻り値nilとエラー メッセージ(通常は と組み合わされassertます) です。

拡張機能を C で作成しているため、基本的にリターン コードによる C スタイルのエラー処理に行き詰まっています。これをサポートするには、ほとんどの場合、関数のシグネチャを変更する必要があります。

int kvPairWithNumber(KeyValuePair * kv, char *key, float number)
{
    float *aux = malloc(sizeof(float));
    if (aux == NULL) {
        return 0;
        // note: you could instead just put lua_error here
    }
    *aux = number;
    kv->key = key;
    kv->type = NUMBER;
    kv->value = aux;
    return 1;
}

その後、Lua 関数でエラーを処理できます。

int my_lua_function(lua_State * L)
{
    KeyValuePair kv = {0};

    // first method:
    if (!kvPairWithNumber(&kv, "asdf", 1.0)) {
        luaL_error(L, "could not create pair!");
    }

    // second method:
    if (!kvPairWithNumber(&kv, "asdf", 1.0)) {
        lua_pushnil(L);
        lua_pushstring(L, "could not create a pair!");
        return 2;
    }
}

拡張機能を使用した Lua コードは次のようになります。

-- first method:
local result = xpcall(my_lua_function, error_handler)

-- note: if you need to pass args, you will need a closure
local result = xpcall(function() my_lua_function(x, y, z) end, error_handler)

-- second method:
local result = assert(my_lua_function())
于 2013-01-14T04:23:55.043 に答える