2

私はこれを解決するために過去6時間を費やしました!そして私はどこにでも行くことができません:s

c ++ファイルでluaテーブルを作成し、それを次のlua関数を持つluaスクリプトファイルに渡すことができるようにしたいと思います。

function MTable (t) 
local n=#t
    for i=1,n do 
      print(t[i]) 
    end
end

2つの文字列を含む1次元配列を動的に作成しました。

 lua_newtable(L);
 lua_pushstring(L,"10.10.1.1");
 lua_pushstring(L,"10.10.1.2");
 lua_rawseti(L,-3,2);
 lua_rawseti(L,-2,1);

これで、スタックの一番上にテーブルができました。私はこれを書くことによってそれを検証しました:if(lua_istable(L、lua_gettop(L))) `1を返しました、これはそれがテーブルであることを意味します。

それから私はこれをしました:

lua_getglobal(L, "MTable");    // push the lua function onto the stack

uint32_t   result = lua_pcall(L, 1, 0, 0);  //argument 1 is for the table
 if (result) {
 printf(stderr, "Failed to run script: %s\n", lua_tostring(L, -1));
         exit(1);
}

そのため、次のエラーが発生しました: スクリプトの実行に失敗しました:テーブル値を呼び出そうとしました

このファイルには、C++から正常に呼び出している他のいくつかの関数があることに注意してください。

誰かが私がこのエラーを解決するのを手伝ってくれますか?これはLUAのバグでしょうか?cz私は手順を非常に正しく実行しました...私は推測します!

4

1 に答える 1

4

関数は、引数の前に、スタックの最初にある必要があります。

次のいずれかを実行できます。

  1. テーブルを生成する前に、関数をプッシュしてスタックを呼び出します。例:

    lua_getglobal(L, "MTable");
    ...generate table on stack...
    int result = lua_pcall(L, 1, 0, 0);
    
  2. 現在実行している順序で実行し、pcallを実行する前にargと関数を交換するだけです。

    ...generate table on stack...
    lua_getglobal(L, "MTable");
    lua_insert (L, -2);   // swap table and function into correct order for pcall
    int result = lua_pcall(L, 1, 0, 0);
    
于 2012-05-20T02:55:15.980 に答える