2012-09-27 8 views
3

나는 루아에서 호출 된 c 함수를 가지고있다. 첫 번째 매개 변수는 테이블입니다. 이 테이블은 기본 API에 대한 숫자의 입력 배열로 남용됩니다. 그래서 지금 내 코드는 다음과 같습니다 c로 루아 테이블의 테이블 길이를 얻는 방법은 무엇입니까?

int n = 0; 
lua_pushnil (L); 
while (lua_next (L, 2)) { 
    n++; 
    lua_pop (L, 1); 
} 
int *flat = alloca (n * 4); 
lua_pushnil (L); 
int i = 0; 
while (lua_next(L,2)) { 
    flat[i++] = (int)lua_tonumber(L, -1); 
    lua_pop (L, 1); 
} 

은 그래서 오류를 용서하십시오, 코드 블라인드를 입력했습니다. 또한 오류를 검사하지 않습니다. 하지만 문제는 while 루프를 두 번해야한다는 것입니다. 이를 피할 수있는 쉬운 방법이 있습니까? 나는 입력이 좋은 경우를 위해 최적화하고 싶다 - int의 테이블.

+0

일반적으로, 나는 대답을 루아 워드 프로세서에있는 질문을 downvote 줄. 그러나 함수 이름이 명확하지 않고 명백한 Google 검색이 그것을 찾지 못했다는 것을 고려해 볼 때, 나는 그것을 미끄러지게 할 것이다. –

+1

죄송 합니다만, 루아는 특히 구글에서 힘들 것 같습니다. 여기에 5.1과 5.2 사이에 많은 변화가 있음을 추가하십시오. 나를 잘못 이해하지 마라, 나는 많은 것을 배우고있다. 그러나 참조 매뉴얼은 찾기가 어렵다. 예를 들어 이전에 나는 luaL_checklong을 다시 구현하는 데 약간의 시간을 보냈다. – starmole

답변

7

당신이 찾고있는 함수는 lua_objlen 또는 Lua 5.2, lua_len (metamethod 호출을 피하려면 lua_rawlen)이라는 직관적이지 않습니다. 많은 역할을합니다 (문자열의 길이와 같은 일부는 문자열과 길이를 얻기 위해 lua_tolstring을 사용할 수있는 경우 매우 유용하지 않으므로 잘 알고 있어야합니다).

+1

테이블이 인접한 정수가 아닌 다른 값으로 구성되어 있으면 올바른 숫자가 반환되지 않을 수 있습니다. [this (http://stackoverflow.com/questions/652957/how-do-i-get-the- number-of-keys-in-a-hash-table-in-lua) 및 [this] (http://stackoverflow.com/questions/2705793/how-to-get-number-of-entries-in-a - 루아 - 테이블). – mtsvetkov

+0

실제로 테이블이 정수가 아닌 연속되지 않는 것들로 구성되어있는 한 실제로 작동합니다. 루아에서는 [이것은 '시퀀스'라고 불린다.] (http://www.lua.org/manual/5.2/manual.html#3.4.6). Lua 5.1에서는 정의가 약간 다르지만 Lua 5.2의 정의는 더 간단하다는 점에 유의하십시오. 또한 루아 5.2에서 lua_objlen은 [lua_rawlen] (http://www.lua.org/manual/5.2/manual.html#lua_rawlen)으로 이름이 바뀌었고 __len 메타 메서드를 존중하지 않습니다. – catwell

+0

5.2 업데이트를 이용해 주셔서 감사합니다. 나는 5.2를 사용하고 있다고 언급 했어야했다. – starmole

관련 문제