2013-07-27 9 views
3

저는 Lua를 스크립팅 언어로 사용하는 C++로 작성된 프로젝트를 진행하고 있습니다. 디버깅을 용이하게하기 위해 우리는 루아 코드를 받아서 실행하고 Json에서 리턴 값을 인코딩 한 다음 그 문자열을 되돌려 보내는 네트워크 디버거를 구현했습니다.C 응용 프로그램에서 userdata의 Lua 변수에 액세스

테이블 용으로 구현했지만 지금은 userdata에 저장된 변수가 붙어 있습니다. 예.

Elements.Avatar.testVar = 5 

Elements.testVar = 15 

return Elements  

// result 
{ 
    "result0": "{Application:userdata; Avatar:userdata; Physics:userdata; testVar:15; }" 
} 

Application, AvatarPhysics는 C에서 생성 된 개체 ++ :이 루아 코드가 있습니다. 그러나 위의 스크립트에서 두 개의 testVars이 생성되었습니다. Elements은 테이블이므로 모든 요소를 ​​나열 할 수 있지만 AvatarLUA_TUSERDATA이므로 Avatar.testVar이 숨겨져있는 것 같습니다.

누구나 루아에서 userdata에 추가 된 변수를 어떻게 감지 할 수 있습니까?

답변

2

"userdata에 저장된 변수"와 같은 것이 없습니다. 적어도 루아가 관련되어 있지는 않습니다. 루아의 관점에서, userdata는 거대한 블랙 박스입니다. Avatar.testVar = 5 모두 testVar 문자열과 15Avatar의 메타 메서드 __newindex을 호출합니다. C++ 메타 분석법 (C++ 코드 만이 메타 데이터를 사용자 데이터에 적용 할 수 있기 때문에)이 코드는 이고 전체 코드는입니다.

그래서 루아에서는 할 수 없습니다. 코드에서 디버깅 후크를 제공해야합니다. 루아 5.2는 pairsipairs 함수가 여러분의 값을 반복하는데 사용할 수있는 __pairs__ipairs 메타 메소드를 구현할 수있게 해줍니다. 그 외에도 사용자 데이터에 존재 여부를 묻는 쿼리를 직접 작성할 수 있습니다.

+0

좋습니다. 매우 도움이됩니다. C++ 측에서이 값을 나열하려고하는데 문제가되지 않습니다. 저는 OOLUA를 사용하여 루아 구현이 더 쉬워졌고, 이로 인해 userdata 객체와 함께 값을 저장하는 옵션이 언어에 내재되어 있다고 가정하게되었습니다. 그렇다면 Avatar.testVar의 저장 방법을 알아 내기 위해 OOLUA가 제공 한 바인딩 코드를 확인해야합니다. –

+0

@ user2626359 : 아마도 'testVar'는 OOLUA로 노출 한 C++ 클래스의 C++ 변수 이름입니다. 그렇습니까? –