2010-09-14 7 views
1

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

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

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

Любые идеи?

Спасибо!

ответ

2

Вот несколько источников, которые могут сработать для вас. Это может потребоваться еще немного полировки и тестирования. Он ожидает, что кусок 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; 
} 
+0

Большое спасибо! Ваш код помог мне на тонну! Но я кое-что забыл, может быть, вы тоже могли бы мне помочь: мне нужна функция lua, чтобы получить строку из C++, поэтому мне нужен один дополнительный шаг для толкания строкового аргумента и доступа к нему из функции lua. Было бы здорово, если бы вы могли помочь. Еще раз спасибо!! – Koko

+0

Введите строку в стек перед вызовом 'luaL_dostring()', используя 'lua_pushstring (L, argument.c_str());' затем измените 'luaL_dostring()' на 'if (0 == luaL_loadstring (L, lua_source_code. c_str())) lua_pcall (L, 1, 1, 0)); – gwell

1

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

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

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

Если вы не можете понять, как бороться со стеком, вам, возможно, будет tutorials. Чтобы найти количество элементов, я нашел это mailing list post, что может быть полезно.

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

0

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

Смежные вопросы