文字列の配列を返し、それらを c++ ベクトルとして格納する lua 関数を呼び出す、非常に単純な c++ 関数が必要です。関数は次のようになります。
std::vector<string> call_lua_func(string lua_source_code);
(lua ソース コードには、文字列の配列を返す lua 関数が含まれています)。
何か案は?
ありがとう!
文字列の配列を返し、それらを c++ ベクトルとして格納する lua 関数を呼び出す、非常に単純な c++ 関数が必要です。関数は次のようになります。
std::vector<string> call_lua_func(string lua_source_code);
(lua ソース コードには、文字列の配列を返す lua 関数が含まれています)。
何か案は?
ありがとう!
ここにあなたのために働くかもしれないいくつかのソースがあります. もう少し磨きとテストが必要かもしれません。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;
}
まず、Lua 配列には整数だけでなく、他の型もキーとして含めることができることを覚えておいてください。
その後、luaL_loadstring を使用して Lua ソース コードをインポートできます。
この時点で、残っている唯一の要件は「戻りベクトル」です。これでlua_istable
、値がテーブル (配列) であるかどうかを確認しlua_gettable
、複数のフィールドを抽出して ( http://www.lua.org/pil/25.1.htmlを参照)、手動で 1 つずつ追加することができます。ベクター。
スタックの扱い方がわからない場合は、役立つチュートリアルがいくつかあるようです。要素の数を見つけるために、このメーリング リストの投稿を見つけました。これは役立つかもしれません。
現在、Lua がインストールされていないため、この情報をテストできません。しかし、とにかく役立つことを願っています。
あなたの質問に対する答えではありません:
単純な lua c-api を使用して c++ <=> lua インターフェイス コードを作成するときに、多くの問題が発生しました。その後、さまざまな lua-wrapper をテストしましたが、多かれ少なかれ複雑なことを達成しようとしている場合は、luabindをお勧めします。数秒でタイプを lua で使用できるようにすることができます。スマート ポインターのサポートはうまく機能し、(他のプロジェクトと比較して) ドキュメントは多かれ少なかれ優れています。