@ZackLee Как только появляется ответ на вопрос, минимальная награда увеличивается с 50 до 100.

т я пытаюсь обернуть следующую функцию с помощью SWIG.

static void readTable(int argc, t_atom *argv) { //accepts table in Lua e.g. readTable({"ab",3});

        for (int i=0; i<argc; ++i) {

            if (argv[i].a_type == A_FLOAT)
                printf("FLOAT : %g\n", argv[i].a_w.w_float);
            else if (argv[i].a_type == A_SYMBOL)
                printf("SYMBOL : %s\n", argv[i].a_w.w_symbol->s_name);
        }
    }

Вот типографская карта, которую я создал.

%include "exception.i"
%typemap(in) (int argc, t_atom *argv)
{
    if (!lua_istable(L, 1)) {
      SWIG_exception(SWIG_RuntimeError, "argument mismatch: table expected");
    }
    lua_len(L, 1);
    $1 = lua_tointeger(L, -1);
    $2 = (t_atom *)getbytes($1 * sizeof(t_atom)); //internally calls calloc()

    for (int i=0; i<$1; ++i) {

        lua_pushinteger(L, i+1);
        lua_gettable(L, 1);

        if(lua_isnumber(L, -1)) {

            $2[i].a_type = A_FLOAT;
            $2[i].a_w.w_float = lua_tonumber(L, -1);
        }          
        else if(lua_isstring(L, -1)) {

            $2[i].a_type = A_SYMBOL;
            $2[i].a_w.w_symbol = gensym(lua_tostring(L, -1));
        }
    }
    freebytes($2, $1 * sizeof(t_atom)); //internally calls free()
}

Как видите, я выделяю память для массива, используяgetbytes() который внутренне вызываетcalloc() и освободить память, используяfreebytes() который внутренне вызываетfree().

Удивительно, когда я звонюreadTable() Функция в Lua, она работает нормально, без сбоев.

например, позвонивtest.readTable({3, "abc"}) в Lua выводит следующий результат.

FLOAT : 3
SYMBOL : abc

Мои вопросы

а) как можноreadTable() выводить результаты без сбоев при освобождении памяти в интерфейсе SWIG? Может быть, память не освобождается должным образом?

б) Если а) не имеет смысла или небезопасно для использования, вы бы порекомендовали позвонитьfreebytes() внутри функцииreadTable() вместо этого так может быть, как следующее?

static void readTable(int argc, t_atom *argv) {

        for (int i=0; i<argc; ++i) {

            if (argv[i].a_type == A_FLOAT)
                post("FLOAT : %g", argv[i].a_w.w_float);
            else if (argv[i].a_type == A_SYMBOL)
                post("SYMBOL : %s", argv[i].a_w.w_symbol->s_name);
        }
        freebytes(argv, argc * sizeof(t_atom));
    }

Ответы на вопрос(1)

Ваш ответ на вопрос