2013-03-13 1 views
3

나는이 보일러 플레이트의 예를 다음 : http://www.matrix44.net/blog/?p=456루아 초보자 : C-Lua C에서 구조체/버퍼를 루아에 전달하는 법?

내가 루아에 C 맞은 편에 문자열을 보낼 수 있어요,하지만 나는 구조체를 (내가 lua_newuserdata를 사용)에 합격하면 오류를 얻고있다.

- C의 가위질 ---

//s = (ST*) malloc (sizeof(ST)); 
// lua_pushlightuserdata(state, s); 
s = lua_newuserdata(state, sizeof(ST)); 
s->a=11; 
s->b=12; 

의 printf ("S = P % \ 없음", S); // 인쇄 0x80a708 결과 = lua_pcall (상태, 0, LUA_MULTRET, 0);


--- 루아 싹둑 ---- 인쇄 (foo는) // 인쇄 0x80a708 io.write ("받은이있다 : \ n", foo.a); // ERROR : script.lua : 스크립트를 실행하는 데 실패 1 : 인덱스 글로벌 'foo는'시도 (A 유저 데이터 값)


어떻게 구조체/테이블 레코드의 버퍼를 캐스팅 할?

궁극적으로, 내 C 프로그램은 구조체가 루아에 버퍼를 전달한다는 것을 알지 못하고 루아는 구조체를 알고 거기에 캐스트해야합니다.

감사합니다. 추신 : 스크립트와 C 프로그램 모두의 printf는 (0x80a708) 일치합니다.

+0

할당 및 동등성 테스트를 제외하고 루아의 'userdata'값에 대한 사전 정의 된 연산은 없습니다. 사용자 데이터의 메타 테이블을 사용하여 조회가 어떻게 작동하는지 정의해야합니다. ... 또한, C 프로그램이 구조체를 모르지만 루아가하는 경우 - 어디에서 오는 것입니까? –

+0

기본적으로 C 프로그램은 서버가 보내는이 버퍼를 루아 [struct it 유형을 알고있는 클라이언트로 가정]에 전달하는 브로커입니다. – resultsway

+0

어떤 접근법으로도 문제는, C로 얻는 것은 멤버 이름이다. (테이블이나 userdatum에'__index' 메타 메소드를 사용하는 것). 구조체의 멤버를 반환하는 방법은 모르겠다. 이름을 문자열로 지정하는 것부터 -이 문자열을 멤버/오프셋에 매핑하는 일종의 테이블 (또는'switch' 문)을 만들지 않는 한 - 당신은 이를 명시 적으로 수행하십시오. 차례로 구조체의 멤버를 알아야합니다. –

답변

1

해결 : 당신은 다음처럼 작성할 수 있습니다 나는 luajit을 사용하고 C로 버퍼를 전달하고 캐스팅 할 수 있었다 구조체는 루아쪽에있다.

2

사용자 데이터 내부는 루아 코드로 접근 할 수 없습니다.
C에서 Lua로 struct를 전달하기위한 테이블을 사용하십시오.
또는 metatable을 통해 사용자 데이터에 대한 색인 생성을 수동으로 정의하십시오.

4

루아에는 구조체가 없으므로 테이블이 있습니다.

UserData는 불투명 한 데이터를 루아에게 전달하는 편리한 방법이지만 루아는 내부를 볼 수 없습니다. Userdata는 C++로 다시 전달할 때만 유용하며 그 내용을 결정할 수 있습니다 (본질적으로 올바른 형식으로 변환).

루아 테이블은 C++의 struct에 가장 가깝습니다. 이와

lua_newtable(state); 
lua_pushnumber(state, s->a); 
lua_setfield(state, -2, "a"); 
lua_pushnumber(state, s->b); 
lua_setfield(state, -2, "b"); 

, 지금은 루아에서 참조 할 수 있습니다 :

print(foo.a); -- this will now print 11 
+0

나는 테이블을 안다. 내 C 프로그램은 구조체를 인식하지 못한다. 버퍼를 루아에게 전달하는 중개인 일 뿐이므로, 루아 구조체 나 테이블에 버퍼를 캐스팅하는 방법은 무엇인가? Iam은 여전히 ​​색인 생성을 읽지 만 얻지는 못합니다. – resultsway

+2

버퍼의 구조를 알기 위해서는 어느 시점에서 C가 필요합니다. 루아는 그 자체만으로는 그것을 할 수 없을 것입니다. 왜냐하면 C 구조체는 단순히 포인터에 대한 오프셋 집합이며 컴파일러에 의해 생성되기 때문입니다. C 구조체에 액세스 할 수있는 유일한 안전한 방법은 C를 사용하는 것입니다. 작성시 표현이 없으면 메타 테이블을 만들어 원래 사용한 사용자 데이터에 연결할 수 있습니다. 그런 다음 metatable에 대해 __index를 구현하여 적절한 값을 반환합니다. C에서해야 할 일이 있습니다. 메타 테이블을 사용하여 값을 인덱싱하는 방법에 대한 아이디어를 보려면 다음을 참조하십시오. http://www.lua.org/pil/13.4.1.html – sergio

+0

@purpletech 대부분 루아가 구조를 이해할 필요가 있습니다. 루아를 두 테이블 모두로 처리 할 수 ​​있습니다. 이런 방식으로 네이티브 C 구조체 대신에 GetField (또는 템플릿을 사용하지 않는 경우 GetNumber)와 같은 메서드가있는 LuaTable 클래스를 사용할 수 있습니다. – sergio