Luaプログラミング入門 > 第8章 C言語との連携 > Luaスタック > Luaスタック上のテーブルの格納と参照


[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

Luaスタック上のテーブルの格納と参照 応援する 

Luaスタック上のテーブルの値を書き換えたり参照したりすることもできます.

void lua_settable (lua_State *L, int index);
void lua_setfield (lua_State *L, int index, const char *k);
void lua_gettable (lua_State *L, int index);
void lua_getfield (lua_State *L, int index, const char *k);

スタック上に存在しているテーブルにキーと値を格納するには lua_settable関数かlua_setfield関数を使用します.

lua_settable関数はスタックトップには格納する値を, スタックトップの一つ下にはキーとなる値を入れておき, これらのペアをindexで指定したテーブルに格納します(図\ref{Fig:chaptest_stack10}). また,スタックに積まれていたキーと値はスタック上から削除されます.

lua_setfield関数はキーを関数側から指定できます. スタックトップには格納したい値を積んでおきます. この関数はlua_settable関数とは違い, キーには文字列しか指定できません(図\ref{Fig:chaptest_stack11}).

lua_gettable関数は indexで指定したテーブルからキーと対になっている値を取得しスタックに積みます. キーはスタックトップに積んでおきます(図\ref{Fig:chaptest_stack12}).

lua_getfield関数は キーを関数側から指定できます. この関数もlua_gettable関数とは違い, キーには文字列しか指定できません(図\ref{Fig:chaptest_stack13}).

テーブルはC言語側から作成することができます. 空のテーブルを作成したい場合はlua_newtable関数を呼び出します (図\ref{Fig:chaptest_stack09}).

void lua_newtable (lua_State *L);

この関数は実はlua_createtable関数のマクロとなっています.

void lua_createtable (lua_State *L, int narr, int nrec);

引数narrには配列要素の個数を,nrecには非配列要素の個数を指定します. この個数を指定するとあらかじめ割り当て済みの空間が与えられます. 要はテーブルがたくさん要素を持つことがあらかじめ分かっている場合に 役にたつ関数です.

 lua_newtable(L)

 lua_createtable(L, 0, 0)

とマクロで定義されています.

通常テーブルを作る際はlua_newtable関数で十分です.

以上の関数を使ったサンプルコードをお見せします.

#include <stdio.h>

#include "lua.h"
#include "lualib.h"
#include "lauxlib.h"

void dumpStack(lua_State* L)
{
        (略)
}

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

        lua_newtable(L); //新しいtableの作成
        lua_pushnumber(L, 10); //key
        lua_pushstring(L, "hello"); //value
        dumpStack(L);

        // table[10] = "hello" を実行
        lua_settable(L, -3);
        dumpStack(L);

        //value
        lua_pushstring(L, "world");
        //table["key"] = "world" を実行
        lua_setfield(L, -2, "key");
        dumpStack(L);

        lua_pushnumber(L, 10);
        //table[10]の値を取り出しスタックに積む
        lua_gettable(L, -2);
        dumpStack(L);

        //table["key"]の値を取り出しスタックに積む
        lua_getfield(L, -2, "key");
        dumpStack(L);

        lua_close(L);
        return 0;
}

実行結果

Stack[ 3-    string] : hello
Stack[ 2-    number] : 10.000000
Stack[ 1-     table] : table

Stack[ 1-     table] : table

Stack[ 1-     table] : table

Stack[ 2-    string] : hello
Stack[ 1-     table] : table

Stack[ 3-    string] : world
Stack[ 2-    string] : hello
Stack[ 1-     table] : table

[Prev] [Next] [Up] [Contents][フレーム表示] [フレーム解除

このサイトについて|ヘルプ|Q&A|個人情報保護|プライバシーポリシー|利用規約|コメント・トラックバック規約|削除規程|広告掲載
Copyright (c) 2005-2007 Time Intermedia Corporation