Запросите размер таблицы lua в c перед итерацией - PullRequest
2 голосов
/ 27 января 2011

Это должно быть просто, и, вероятно, так и есть, но в моем C-коде я хочу знать размер таблицы, прежде чем начать итерацию по ней. Мне нужно предварительно выделить некоторую память для хранения значений в этой таблице.

Я получаю эту таблицу в качестве параметра в функции lua c.

static int lua_FloatArray(lua_State *L)
{
 int n = lua_gettop(L);
 if (n != 1 || lua_gettype(L, 1) != LUA_TTABLE)
 {
  luaL_error(L, "FloatArray expects first parameter to be a table");
  return 0;
 }
 int tablesize = ????;
 float *a = (float*)lua_newuserdata(L, tablesize * sizeof(float));
 lua_pushnil(L);
 int x = 0;
 while (lua_next(L, index) != 0)
 {
  a[x++] = (float)lua_tonumber(L, -1);
  lua_pop(L, 1); // Remove value, but keep key for next iteration
 }
 return 1;
}

размер таблицы? как получить размер таблицы?

Ответы [ 3 ]

6 голосов
/ 27 января 2011

Если вы работаете с массивами - таблицами с целочисленными ключами, без отверстий (некоторые ключи nil ) - вы можете использовать метод lua_objlen , Цитата из руководства:

Возвращает «длину» значения по заданному приемлемому индексу: для строк это длина строки; для таблиц это результат оператора длины ('#');

4 голосов
/ 27 января 2011

Нет такой функции API. Вы должны считать вещи самостоятельно. С другой стороны, вы, кажется, заполняете массив в C, и я предполагаю, что у вас есть таблица Lua, например, скажем {10,20,30}, и вы предполагаете, что вы получите элементы в указанном порядке. Это не так с lua_next. См. Второй абзац в http://www.lua.org/manual/5.1/manual.html#pdf-next.

0 голосов
/ 27 января 2011

Я не знаю, действительно ли это хорошая практика программирования, но я часто использую 2d массивы / таблицы в виде структуры

с полем для ptr ваших массивов (или указатель на массив указателей)) и поле для количества столбцов и количества строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...