2013-06-20 8 views
2

루아 C API를 사용하여 테이블을 다른 테이블로 옮기려고합니다. 예를 들면,이 구조를 갖는 테이블을 가지고C api에서 lua 테이블 이동하기

I는 아래로,이 테이블 D를 이동할
a[b][c][d][e] = value 

A [B], 내가 좋아 루아 달성 할 수있는 :

a[b][d] = a[b][c][d] 
a[b][c][d] = nil 

내 전류 방법은 스택에 적재되는 A는 [B] [C]는 [D 표는 스택과 같다 : 그래서

Index Value 
-1  d table 
-2  c table 
-3  b table 
-4  a table 

그럼 넣 [B] 보이는 스택에, 그래서 같은

그러면 스택 상 D의 키를 넣고, 표 D 미만 D의 키 및 테이블 B를 삽입하므로 스택은 :

Index Value 
-1  d table 
-2  d key 
-3  b table 
-4  a table 
-5  c table 
-6  b table 
-7  a table 

는 그럼 (-3 L), (B)가 수행 lua_settable 사용 [d] = d.

이 방법은 테이블이 아닌 키에는 적용되지만 테이블 인 키에는 적용되지 않습니다. 그래서 같은 실패합니다 :

a[b][c][{}][d] = value 
a[b] = a[b][c][{}][d] 

주, 나는 위의 키가 새 루아 테이블을 것이기 때문에 위에서 주어진 루아에 실패합니다 알고, 난 그냥 그것을 설명하기 원했다.

나는 행운도없이 테이블 부모 (그래서 [b] = b, lua_setglobal (L, a))를 수행하려고 시도했다. 아무도 내가 여기서 잘못 가고 있다는 것을 알고 있습니까?

편집 : 키/값을 스택에 밀어 넣는 방법에 대한 작은 코드 스 니펫. 문제는 테이블이 있었다

일부 메타 테이블을 가지고 : 목표는 여기 (I 코드에서 호출 또는 그것을 reparent)

http://pastebin.com/Y4540Wss

해결책 다른 하나 개의 테이블 구조에서 테이블을 이동하는 것입니다 함수를 사용하여 테이블을 변경하지 못하게했습니다 (본질적으로 스크립트 작성자는 구조가 중요한 구성 테이블을 가지고 있으므로이 문제가 발생합니다).

답변

1

설명을 올바르게 이해하면이 루아 코드가 원하는대로 수행됩니다 :

루아 C의 API에 그 구현에 관해서는 16,
local ab = a[b] 
ab[d], ab[c][d] = ab[c][d], nil 

lua2c이 기계 번역에 도움이된다 :

enum { lc_nformalargs = 0 }; 
const int lc_nactualargs = lua_gettop(L); 
const int lc_nextra = (lc_nactualargs - lc_nformalargs); 

/* local ab = a[b] */ 
lua_getfield(L,LUA_ENVIRONINDEX,"a"); 
lua_getfield(L,LUA_ENVIRONINDEX,"b"); 
lua_gettable(L,-2); 
lua_remove(L,-2); 
assert(lua_gettop(L) - lc_nextra == 1); 

/* ab[d], ab[c][d] = ab[c][d], nil */ 
lua_getfield(L,LUA_ENVIRONINDEX,"c"); 
lua_gettable(L,(1 + lc_nextra)); 
lua_getfield(L,LUA_ENVIRONINDEX,"d"); 
lua_gettable(L,-2); 
lua_remove(L,-2); 
lua_pushnil(L); 
lua_getfield(L,LUA_ENVIRONINDEX,"c"); 
lua_gettable(L,(1 + lc_nextra)); 
lua_insert(L,-2); 
lua_getfield(L,LUA_ENVIRONINDEX,"d"); 
lua_insert(L,-2); 
lua_settable(L,-3); 
lua_pop(L,1); 
lua_getfield(L,LUA_ENVIRONINDEX,"d"); 
lua_insert(L,-2); 
lua_settable(L,(1 + lc_nextra)); 
assert(lua_gettop(L) - lc_nextra == 1); 
return 0; 

내가 스택 작업을 작성 읽을 수있는 방법을 개발하기 위해 아직있다.

+1

'lua_getfield' 대신'lua_getglobal'을 사용하십시오. – lhf

+0

@lhf 알겠습니다. 고마워요. 그리고 LUA_ENVIRONINDEX가 루아 5.2에서 삭제 된 것을 볼 수 있습니다. –

+0

여전히 작동하지 않습니다. 차이가있을 수 있지만 테이블의 키 중 하나는 실제로 다른 테이블입니다. 테이블 키가있는 테이블이 없으면 모든 것이 잘 작동합니다. 필자는 테이블에 f = {};와 같은 참조가 없을 수도 있기 때문에 lua2c에서 이것을 반복하는 방법을 모르겠습니다. a [f] = {}. [{}] = {}처럼 끝났기 때문에 스택의 테이블 키를 얻기 위해 luaL_ref를 사용해야합니다. – Chrismit