Простейшая функция lua, которая возвращает вектор строк - PullRequest
1 голос
/ 14 сентября 2010

Мне нужна очень простая функция c ++, которая вызывает функцию lua, которая возвращает массив строк и сохраняет их как вектор c ++.Функция может выглядеть примерно так:

std::vector<string> call_lua_func(string lua_source_code);

(где исходный код lua содержит функцию lua, которая возвращает массив строк).

Есть идеи?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 19 сентября 2010

Вот некоторый источник, который может работать для вас.Возможно, потребуется еще немного полировки и тестирования.Ожидается, что кусок Lua возвращает массив строк, но с небольшими изменениями может вызвать именованную функцию в блоке.Таким образом, как есть, он работает с "return {'a'}" в качестве параметра, но не "function a() return {'a'} end" в качестве параметра.

extern "C" {
#include "../src/lua.h"
#include "../src/lauxlib.h"
}

std::vector<string> call_lua_func(string lua_source_code)
{
  std::vector<string> list_strings;

  // create a Lua state
  lua_State *L = luaL_newstate();
  lua_settop(L,0);

  // execute the string chunk
  luaL_dostring(L, lua_source_code.c_str());

  // if only one return value, and value is a table
  if(lua_gettop(L) == 1 && lua_istable(L, 1))
  {
    // for each entry in the table
    int len = lua_objlen(L, 1);
    for(int i=1;i <= len; i++)
    {
      // get the entry to stack
      lua_pushinteger(L, i);
      lua_gettable(L, 1);

      // get table entry as string
      const char *s = lua_tostring(L, -1);
      if(s)
      {
        // push the value to the vector
        list_strings.push_back(s);
      }

      // remove entry from stack
      lua_pop(L,1);
    }
  }

  // destroy the Lua state
  lua_close(L);

  return list_strings;
}
1 голос
/ 14 сентября 2010

Прежде всего, помните, что массивы Lua могут содержать в качестве ключей не только целые числа, но и другие типы.

Затем вы можете импортировать исходный код Lua с помощью luaL_loadstring.

На этом этапеединственное оставшееся требование - «вектор возврата».Теперь вы можете использовать lua_istable, чтобы проверить, является ли значение таблицей (массивом), и использовать lua_gettable, чтобы извлечь несколько полей (см. http://www.lua.org/pil/25.1.html) и вручную добавить их одно за другим в вектор.

Если вы не можете понять, как обращаться со стеком, похоже, вам помогут учебники . Чтобы найти количество элементов, я нашел это сообщение в списке рассылки , что может быть полезным.

Сейчас у меня не установлено Lua, поэтому я не могу проверить эту информацию. Но я надеюсь, что она все равно поможет.

0 голосов
/ 14 сентября 2010

Не совсем ответ на ваш вопрос:У меня было много проблем при написании кода на языке c ++ <=> lua с простым lua c-api.Затем я протестировал много разных lua-оболочек, и я действительно предлагаю luabind , если вы пытаетесь достичь чего-то более или менее сложного.Можно сделать типы доступными для lua за считанные секунды, поддержка умных указателей работает отлично и (по сравнению с другими проектами) документация более или менее хороша.

...