나는이 보일러 플레이트의 예를 다음 : 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) 일치합니다.
할당 및 동등성 테스트를 제외하고 루아의 'userdata'값에 대한 사전 정의 된 연산은 없습니다. 사용자 데이터의 메타 테이블을 사용하여 조회가 어떻게 작동하는지 정의해야합니다. ... 또한, C 프로그램이 구조체를 모르지만 루아가하는 경우 - 어디에서 오는 것입니까? –
기본적으로 C 프로그램은 서버가 보내는이 버퍼를 루아 [struct it 유형을 알고있는 클라이언트로 가정]에 전달하는 브로커입니다. – resultsway
어떤 접근법으로도 문제는, C로 얻는 것은 멤버 이름이다. (테이블이나 userdatum에'__index' 메타 메소드를 사용하는 것). 구조체의 멤버를 반환하는 방법은 모르겠다. 이름을 문자열로 지정하는 것부터 -이 문자열을 멤버/오프셋에 매핑하는 일종의 테이블 (또는'switch' 문)을 만들지 않는 한 - 당신은 이를 명시 적으로 수행하십시오. 차례로 구조체의 멤버를 알아야합니다. –