2011-06-19 11 views
3

編集: 私が前にコメントしたように、私の問題は文字列をキーとして使用するCでテーブルを作成できないことです。なぜこのコードでLuaが空のテーブルを返すのですか?

#include <lua.hpp> 
#include <String.h> 

BString 
LuaTypeToString(lua_State *L, int index, int type) 
{ 
    BString out; 
    switch (type) 
    { 
     case LUA_TSTRING: 
     { 
      out << "'" << lua_tostring(L, index) << "'"; 
      break; 
     } 
     case LUA_TBOOLEAN: 
     { 
      out << (lua_toboolean(L, index) ? "true" : "false"); 
      break; 
     } 
     case LUA_TNUMBER: 
     { 
      out << (float)lua_tonumber(L, index); 
      break; 
     } 
     default: 
     { 
      out << lua_typename(L, type); 
      break; 
     } 
    } 
    return out; 
} 


void 
DumpLuaTable(lua_State *L, int tableIndex) 
{ 
    lua_pushnil(L); 
    printf("\t{ "); 
    while (lua_next(L, tableIndex) != 0) 
    { 
     BString keyString = lua_tostring(L, -2); 

     BString valueString; 
     int type = lua_type(L, -1); 
     if (type == LUA_TTABLE) 
      DumpLuaTable(L, lua_gettop(L)); 
     else 
      valueString = LuaTypeToString(L, -1, type); 

     printf("%s=%s,", 
      keyString.String(), 
      valueString.String()); 
     lua_pop(L, 1); 

     if (lua_isnumber(L, -1)) 
     { 
      lua_pop(L, 1); 
      break; 
     } 
    } 
    printf(" }"); 
} 


void 
DumpLuaStack(lua_State *L) 
{ 
    printf("DumpLuaStack:\n"); 
    int top = lua_gettop(L); 
    for (int i = 1; i <= top; i++) 
    { 
     int type = lua_type(L, i); 
     if (type == LUA_TTABLE) 
      DumpLuaTable(L, i); 
     else 
      printf("\t%s ", LuaTypeToString(L, i, type).String()); 
    } 
    printf("\n"); 
} 



static 
int 
ReturnTable(lua_State *L) 
{ 
    lua_newtable(L); 
    lua_pushnumber(L, 3.14); 
    lua_pushstring(L, "1"); 
    lua_settable(L, -3); 

    DumpLuaStack(L); 

    return 1; 
} 


int 
main(void) 
{ 
    lua_State *L = luaL_newstate(); 
    luaL_openlibs(L); 

    lua_pushcfunction(L, ReturnTable); 
    lua_setglobal(L, "ReturnTable"); 

    int status = luaL_dofile(L, "luatest.lua"); 
    if (status) 
     printf("Status = %d: %s\n", status, lua_tostring(L, -1)); 

    lua_close(L); 

    return status; 
} 

そして、それのLuaの一部:

function DumpTable(table) 
    print("LuaDumpTable") 
    local out = "\t" 
    if #table > 0 then 
     for i, v in ipairs(table) do 
      out = out .. i .. "=" .. v .. " " 
     end 
     print(out) 
    else 
     print("\tEmpty table") 
    end 
end 

value = ReturnTable() 
if (type(value) == "table") then 
    DumpTable(value) 
else 
    print(type(value)) 
end 

コードここ

は、C++、それの一部である:私は私がいる問題を示して簡単なテストプログラムを作りました問題なく動作するので、Luaスクリプトはあなたが期待するものを表示します。 3.14をスタックにプッシュする行を、例えば lua_pushstring(L, "foo");に変更して、私が得るのはすべてLua側の空のテーブルです。私がここで間違っていることは何ですか?

+2

私は考えることができる唯一のことは、あなたがテーブルが空であることを判断するために使用Luaのコードを示すことです。あなたがここに示したものはすべて正しいようです。 –

+0

B Mitchさんのコメントはまだありませんか? DumpTableのバージョンで彼が '#table 'をどう使っていないのか見てきましたか?どうやって 'ipairs'を使っていなかったのか、代わりに' pairs'を使っていたのですか?なぜあなたはそれをして、それがどのように機能するか見てみませんか? –

答えて

5

あなたはLuaの中に、誤ってテーブルをチェックしている:

if #table > 0 then 

#tableはちょうどあなたがテーブルに挿入された文字列を持っている場合は表の最初の未使用の整数が0であることを語っています、それは連続配列の一部ではないのでカウントをインクリメントせず、ipairsで処理することもできません。ただ、pairsの使用に切り替えると、あなたはfoo表示されるはずです。私は、これが問題を引き起こすが、APIのルアから呼び出されるためにはないだろう

:FYIとして残し

function DumpTable(table) 
    print("LuaDumpTable") 
    local out = "\t" 
    for i, v in pairs(table) do 
     out = out .. i .. "=" .. v .. " " 
    end 
    print(out) 
end 

古いノートを、通常、スタックの入力をポップアウトしたいとします。だから、lua_tonumberコールの後:

int32 value = lua_tonumber(L, 1); 

lua_pop(L, 1); 

rgb_color c = ui_color((color_which)value); 
+0

答えを待っている間、私は自分がやっていたことを簡単なテストプロジェクトに取り除いた。私はキーの文字列を使用するテーブルを返すのに問題があります。私は1秒後にドアを出なければならないが、私が戻ったときに改訂版を投稿する。 – DarkWyrm

+1

*額を叩く*もちろん!私は#演算子(とlua_objlen)は整数のインデックスだけを数えていることを忘れていました。私はipairs対ペアのことについては知らなかったので、あなたの時間と忍耐の両方のために*非常に*多くをありがとう。 :) – DarkWyrm

関連する問題