루아팅커 NULL리턴할때...

프로그래밍 일반에 관한 포럼입니다.

Moderator: 류광

Locked
킬제덴
Posts: 11
Joined: 2009-10-14 18:30

루아팅커 NULL리턴할때...

Post by 킬제덴 »

안녕하세요? 질문 러쉬군요 :) :) :)

C함수에서 NULL을 리턴해서 lua에 돌려줄때 그러니까 nil이 되는거겠죠.
이 nil을 다시 인자로 넘겨줄때의 상황입니다.

Code: Select all

class CTest
{
public:
  CTest() {}
  ~CTest() {}

  CTest *Get( void )
  {
     return NULL;                        // NULL을 리턴해줌
  } 
  void Set( CTest *p )
  {
  }
};

-- lua코드
function LuaCode()
{
  local p = obj:Get()
  obj:Set( p )                          -- 이때 Set이 호출되지 않고 에러가 납니다. no class at first argument
}
처음에 이게 왜 안되는걸까 해서 이것저것 실험해보니 NULL값을 루아에서 받고 이것을 다시 함수인자로
사용하려 할때만 에러가 나더군요.
print로 p값을 찍어보니 nil type에 nil 값이더군요.
NULL이 아닌 포인터를 넘겨주면 userdata타입으로 되고 이건 정상 호출되고요. nil일때만 문제가 생깁니다.
이건 어떻게 해결해야 좋을까요?
zupet
Posts: 2764
Joined: 2003-05-13 03:34
Location: NCSOFT LE팀

Post by zupet »

안녕하세요.

이 문제는 nil 을 userdata 로 취급 할 것이냐 아니냐의 문제입니다. 다음 코드를 고치면 문제를 해결할 수 있지만 저는 사용하는 동안 특별히 문제가 발생하지 않아 그냥 사용하고 있습니다. 예전에는 이러한 체크 코드도 없었다가 실행중 스크립트 실수로 쉽게 크래쉬가 나기 때문에 추가한 부분입니다. NULL 을 자주 쓰신다면 이 부분을 지워 버리시면 됩니다. 그렇지만 스크립터가 객체가 아닌걸 넘기면 크래쉬를 막을 수 없기 때문에 고민을 좀 하셔야 할 겁니다.

Code: Select all

template<typename T>
struct lua2object
{ 
	static T invoke(lua_State *L, int index) 
	{ 
		if(!lua_isuserdata(L,index) || !lua_isnil(L,index)) //!lua_isnil(L,index) 를 추가해줬다. 또는 이 if 전체를 지워버려도 된다.
		{
			lua_pushstring(L, "no class at first argument. (forgot ':' expression ?)");
			lua_error(L);
		}
		return void2type<T>::invoke(user2type<user*>::invoke(L,index)->m_p); 
	} 
};
Locked