문제

나는 내가 개발중인 C ++ 응용 프로그램에 LUA를 포함하고있다. 저의 의도는 LUA를 사용하여 주문한 작업을 스크립트하여 주어진 입력에 대해 수행하는 것입니다. C ++ 프로그램에서 새 작업 항목을 받고 LUA 백엔드에 세부 정보를 전달하고 LUA는 C ++로 전화하여 필요한 작업을 수행하고 완성 된 결과를 반환합니다.

관련된 주요 데이터 구조는 대규모입니다 (약 80 명 이상의 회원) struct. 나는 (매우) LUA를 처음 접했으며 호스트 응용 프로그램과 임베디드 LUA 상태에서 어떻게 전달할 수 있는지 확신 할 수 없습니다.

지금까지 나는 내 옵션을 다음과 같이 본다.

a) C ++ 및 LUA를 교차 할 때 모든 개별 데이터 구성원을 스택에 밀고/팝업합니다 (지저분한 소리).

b) 테이블을 구성하고 값으로 채워진 다음 스택을 켜거나 끄는 (약간 더 깨끗한).

c) 통과하십시오 userdata (Light/Heavy?) (나는 이것에 대해 스케치하고 LUA 측에서 어떻게 액세스 할 수 있는지 확실하지 않습니다.

모든 지침은 대단히 감사 할 것입니다.

도움이 되었습니까?

해결책

내가 올바르게 기억한다면, Light UserData는 실제로 포인터 일뿐입니다. 그들은 모두 같은 중족기를 공유합니다. 그들은 주로 C 데이터의 주소를 전달하는 데 사용됩니다.
LUA 측에서 액세스 해야하는 경우 전체 사용자 데이터는 아마도 필요한 것에 더 가까울 것입니다. 예를 들어 정기적 인 LUA 테이블 인 것처럼 메테이터블이 액세스 할 수 있습니다.

Roberto 's에도 관심이있을 수 있습니다 LUA 5.1의 C 스트러크로 데이터를 변환하기위한 라이브러리. 아니면 아니에요. 당신의 필요에 따라 달라집니다 ... :-)

다른 팁

나는 이것을 직접하지 않았다 (Lua를 사용한 지 몇 년이 지났으며 내장 된 방식으로 사용한 적이 없다). 그러나 나는 당신이 조사해야한다고 생각합니다. 중족기 그리고 userData 유형. 매뉴얼은 userData 값에 대해 이것을 말합니다.

이 유형은 원시 메모리 블록에 해당하며 과제 및 신원 테스트를 제외하고 LUA에서 사전 정의 된 작업이 없습니다. 그러나 메타 테이블을 사용하면 프로그래머는 userData 값에 대한 작업을 정의 할 수 있습니다 (§2.8 참조). userData 값은 C API를 통해서만 LUA에서 생성 또는 수정할 수 없습니다.

올바른 소리.

LUA에 전체 표현을 노출시키는 것은 원하는 것이 아닐 수도 있습니다. 어쩌면 당신은 몇 가지 작업 만 노출할까요? 그런 다음 구조물에 대한 포인터를 Light UserData로 사용하십시오. 중족기를 가질 수 없으므로 명시 적 기능을 사용해야합니다.

모든 것을 노출하려면 가장 좋은 방법은 아마도 구조물에 대한 포인터 만 포함 된 전체 사용자 데이터를 푸시하는 것입니다. 이는 성능의 관점에서 소음에서 손실되지만 잘못되기 쉬운 추가 수준의 간접 수준을 의미하므로 C ++/LUA 경계를 가로 지르는 단일 진실 지점을 유지하십시오.

완전한 userData를 사용하면 매크로 (공포!)를 사용하여 각 필드에 GetTter 및 Setter 기능을 넣을 수 있습니다. 이것은 손으로해야 할 일이 많으며 많은 수하물과 함께 톨루아 ++를 확인하는 것이 좋습니다.

LUA 메일 링리스트로 가십시오!

내가 당신이 어디에 있든, 나는 구조물에 대한 참조를 전달한 다음 lua가 C 기능을 호출하여 수정할 것입니다. 이것은 또한 LUA가 기본 시스템의 모든 세부 사항을 알아야하는 경우보다 번거 로움으로 시스템을 업그레이드 할 수 있음을 의미합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top