2011-06-10 7 views
2

내가 사용법을 잘못 이해했거나 문서를 잘못 읽었을 수도 있지만 Lua에 light userdata로 전달 된 구조체 또는 클래스 멤버에 어떻게 액세스합니까? 예를 들어, 벡터Lua에서 Light userdata에 액세스하기

typedef struct Foo { 
    int x; 
    int y; 
} Foo; 

는 '테스트'로 선언하고 X = 413, Y = 612과 같이 정의하고 호출로 밀렸다 다음과 같은 구조체를 사용하는 경우

lua_pushlightuserdata(L, (void *) &test) ; 

어떤 것 x와 y를 조작하거나 인쇄하는 함수의 루아 코드는?

+3

루아 측에서 객체를 조작하고 싶다면 light userdata보다는 userdata를 사용하는 것이 더 나을 것입니다. 나는 C++에서 이것을 수동으로하기위한 긴 대답을 작성했다 : http://stackoverflow.com/questions/3481856/sending-variable-pointers-back-and-forth-between-c-and-lua/3506654#3506654 루아 바인드를 사용할 수 있습니다. –

답변

11

루아의 광 사용자 데이터는 단지 포인터 일뿐입니다. 루아는 포인터에 의해 참조 된 객체의 내용을 읽는 방법을 전혀 모르고있다. 이 데이터의 목적은 하나의 C API 호출이 다른 API 호출에 대한 참조를 전달하도록 허용하는 것입니다.

루아에서 데이터 작업을하려면 스택으로 밀어 넣어야하고, 경우에 따라 테이블로 만들면됩니다. 이 데이터가 C와 Lua 사이에서 동기화되어야한다면 양측에 함수를 작성하여 할당을 처리하고 값을 다른 환경으로 복사해야합니다. 또 다른 옵션은 Lua에있는 데이터 만 가지고 C 언어에있는 Lua API를 통해 가져 오거나 Lua에있을 때 C 언어로 가져 와서 C API를 통해 가져 오는 것입니다.

자세한 내용은 Programming in LuaLua-users Wiki에 대한 간략한 설명이 있습니다.

2

아무것도 아니요. 루아에서 어떤 종류의 사용자 데이터에 대해서도 액세스하거나 아무 것도 할 수 없습니다. 모든 조작을 위해 C++ 함수를 제공해야합니다. 물론 메타 기능을 올바르게 사용하면이 작업을보다 쉽게 ​​수행 할 수 있습니다.

오, 당신은 그럴 필요가 없습니다. typedef struct C++의 쓰레기. 그냥 말해도 돼요

struct Foo { 
    int x; 
    int y; 
}; 
+0

하지만 "x> 5이면 y = -x일까요?"와 같이 '데이터 읽기'는 어떻게됩니까? 데이터 상호 작용의 모든 인스턴스에는 데이터를 변경하거나 반환 할 수있는 자체 C++ 함수가 필요합니까? – Lucas