최상단 광고

2012년 4월 11일 수요일

lua_newtable, lua_settable, lua_gettable 을 써보자.


lua_State* L;

void main()
{
     L = lua_open();
     luaopen_base(L);
     luaopen_io(L);
     luaopen_math(L);
     luaopen_string(L);
     luaopen_table(L);  // 여기까지 했더니, 스택의 top이 7이 되는 군요!

     // 빈 테이블을 만들어 스택에 push합니다. 테이블이 있는 위치는 8이 되겠군요.
     lua_newtable(L); 

     // 테이블에 값을 넣어봅시다. - settable 함수를 써야 합니다.
     // settable을 호출하기 전에 키와 값을 넣어줘야 합니다. (순서유의! 키넣고, 값넣음!)
     lua_pushstring(L,"a");  // 키를 스택에 넣음     lua_pushnumber(L,33); // 값을 스택에 넣음     lua_settable(L,8);         // 스택에 키와 값이 들어감.
  
// 여기까지를 스택의 상태로 살펴보면
|              | 10        |      33     | 10 <-      |              | 10
|              | 9          |       a     | 9            |              | 9
| 테이블    | 8  <-    |   테이블  | 8            | 테이블    | 8 <-
|              | 7          |              | 7            |              | 7
   newtable후,              push 후,                 settable후,
                                                               이제 테이블에 키 = 값의 쌍이 저장.


      // 테이블에서 값을 가져와봅시다. - gettable 함수를 써야합니다.
      // gettable함수를 호출하기 전에 키를 넣어줘야합니다.
      lua_pushstring(L,"a");   // 키를 스택에 넣음
      lua_gettable(L,8);       // 테이블에서 가져옵니다. 8은 테이블이 스택에서의 인덱스.
     
       // 테이블에서 가져온 값은 스택의 top으로 들어옵니다.
       int num = lua_tonumber(L,-1);   // num으로 33이 들어옵니다.

// 여기까지를 스택의 상태로 살펴보면
|              | 10        |              | 10           |              | 10
|              | 9          |       a     | 9   <-      |      33     | 9 <-
| 테이블    | 8  <-    |   테이블  | 8             | 테이블    | 8
|              | 7          |              | 7            |              | 7 

------------------------------------------------------------------------------
이외의 테이블에 값 넣는 함수
* 만일, 키와 값이 int 형이라면 rawseti, rawgeti 를 이용  
(테이블을 배열로 사용하는 경우에 주로 사용하는 함수)
lua_pushnumber(L, 값);
lua_rawseti(L, 테이블위치, 키);
ex) lua_pushnumber(L, 33);
      lua_rawseti(L, 8, 1);        // 1 - 33 쌍으로 테이블에 저장됨

테이블에서 값을 얻는 함수
lua_rawgeti(L, 테이블위치, 키);
ex) lua_rawgeti(L, 8, 1); // top에 값(33)이 push됨 (gettable과 비슷)

------------------------------------------------------------------------------
테이블 횡단하기
int lua_next (lua_State *L, int index);
ex)
lua_pushnil(L);    // lua_next 에게 키를 주기 위해. 일단 nil을 줌.
while (lua_next(L, t) != 0)    // 더이상 횡단할 쌍이 없으면 0리턴 
{
    lua_pop(L, 1);
}
// lua_next를 호출하기 전에 반드시 키가 스택에 들어가 있어야한다.
// lua_next는 key를 빼가고(pop하고), t에 있는 key와 value를 스택에 넣어준다(push)
// pop을 해주는 것은, next호출 후에 스택에 key와 value값이 들어있는데, 루프를 돌기위해 필요한 key만 놔두고 value를 제거하는 것이다.

// 그림으로 살펴보자.
|              | 10        |              | 10           |   33(값)  | 10 <-   |              | 10  
|              | 9          |      nil    | 9   <-      |   1(키)    | 9         |     1(키)  | 9  
| 테이블    | 8  <-    |   테이블  | 8             | 테이블    | 8        |  테이블   | 8  
|              | 7          |              | 7            |              | 7         |              | 7
   초기상태                  pushnil                     lua_nex후,               pop후,
                                                                                            

댓글 없음: