Luaプログラミング入門 > 第8章 C言語との連携 > Luaスタック > Luaスタックの操作


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

Luaスタックの操作 応援する 

スタック操作系の関数を紹介します.

int lua_gettop(lua_State* L);
void lua_settop(lua_State* L, int index);
void lua_pushvalue(lua_State* L, int index);
void lua_remove(lua_State* L, int index);
void lua_insert(lua_State* L, int index);
void lua_replace(lua_State* L, int index);

lua_gettop関数はスタックに積まれている数を取得します.

lua_settop関数はスタックに積まれている値の数を変更します. スタックの値を削除(ポップ)するのに使われています.

indexには変更後のスタックの数を指定します. ただし,マイナスのindexは上から積まれたスタックの数を表しています.

つまり,

 lua_settop(L, -1); //一番上のスタック

は一番上のスタックまで残すという意味です. つまりこの操作をしてもスタックには変化がありません. スタックを操作する時にはマイナスのindexを指定する方法がよく使われます.

スタックを空にするにはindexに0を指定します.

 lua_settop(L, 0); //スタックをすべて削除

スタックの値をポップする場合はlua_pop関数を利用しましたが, この関数は実はlua_settop関数のマクロとなっています.

 #define lua_pop(L, n)  lua_settop(L, -(n) - 1)

lua_pushvalue関数は指定したindexの値を コピーしてスタックにプッシュします.

lua_remove関数は指定したindexの値を削除します. 要素を削除したら,指定したindexの上に乗っていた要素をずらして隙間を埋めます.

lua_insert関数はスタックの一番上にある要素を指定した indexに挿入します.

lua_replace関数はスタックの一番上の要素を指定した indexに置き換えます.

スタック操作系の関数のサンプルコードをお見せします.

#include <stdio.h>

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

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

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

        lua_pushnumber(L, 10); //10 push
        lua_pushnumber(L, 20); //20 push
        lua_pushnumber(L, 30); //30 push
        lua_pushnumber(L, 40); //40 push
        dumpStack(L);

        //スタックの要素数取得
        printf("現在のスタックの数 : %d\n", lua_gettop(L));

        //上から3つ目の要素をコピーしてスタックに積む
        printf("pushvalue -3\n");
        lua_pushvalue(L, -3);
        dumpStack(L);

        //上から3つ目の要素を削除する
        printf("remove -3\n");
        lua_remove(L, -3);
        dumpStack(L);

        //スタックトップの値を2番目に挿入する
        printf("insert 2\n");
        lua_insert(L, 2);
        dumpStack(L);

        //スタックトップの値を2番目の要素とする
        printf("replace 2\n");
        lua_replace(L, 2);
        dumpStack(L);

        lua_close(L);
        return 0;
}

実行結果

Stack[ 4-    number] : 40.000000
Stack[ 3-    number] : 30.000000
Stack[ 2-    number] : 20.000000
Stack[ 1-    number] : 10.000000

現在のスタックの数 : 4
pushvalue -3
Stack[ 5-    number] : 20.000000
Stack[ 4-    number] : 40.000000
Stack[ 3-    number] : 30.000000
Stack[ 2-    number] : 20.000000
Stack[ 1-    number] : 10.000000

remove -3
Stack[ 4-    number] : 20.000000
Stack[ 3-    number] : 40.000000
Stack[ 2-    number] : 20.000000
Stack[ 1-    number] : 10.000000

insert 2
Stack[ 4-    number] : 40.000000
Stack[ 3-    number] : 20.000000
Stack[ 2-    number] : 20.000000
Stack[ 1-    number] : 10.000000

replace 2
Stack[ 3-    number] : 20.000000
Stack[ 2-    number] : 40.000000
Stack[ 1-    number] : 10.000000

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

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