Turbo-C
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
터보-C 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
Lua 게시판
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

Lua 게시판
Lua 스크립트 게시판입니다.
[4] LuaTinker C++빌더에서 사용하기
남병철.레조 [lezo] 12777 읽음    2009-09-21 16:12
어느분이 필요하시다고 하여서 이곳에 간단히 글을 올리겠습니다.
^^; 저도 메타프로그래밍 같은걸 좋아하지도 잘 하지도 않지만 그냥 조금 수정해서 적당히? 붙여 쓰고 있었습니다.
C++빌더에 잘 붙지 않는 가장 큰 이유는... 결국 illegal 한 문법 사용 때문입니다.
(참고로.. 테스트한 버전은 C++빌더 2009입니다.)

뭐 해석의 차이겠지만... 어쨋든 깐깐한 빌더가 저 처럼 표준에 무관심한;; 사람을 밝혀주니 좋긴 합니다만...
가끔 바로갈 길을 돌아가고 싶은 경우가 있듯... 좀 갑갑하기도 합니다.
시간 되시는 분은 좀 돌아가는 길(수정;;)을 알려주셔도 좋고... 흠.. 암튼;;

LuaTinker0.5b를 받으셔서 헤더파일 조금과 컴파일 옵션을 조금 수정 하시면 됩니다.
대부분 명시적이지 않거나 예외상황과 관련된 것입니다. --;;

첫번째 수정 (lua_tinker.h)
//------------------------------------------------------------------------------
	// read a value from lua stack 
	template< typename T >  
	T read(lua_State *L, int index)				{ return lua2type< T >(L, index); }

	template<>	char*				read< char* >(lua_State *L, int index);
	template<>	const char*			read< const char* >(lua_State *L, int index);
	template<>	char				read< char >(lua_State *L, int index);
	template<>	unsigned char		read< unsigned char >(lua_State *L, int index);
	template<>	short				read< short >(lua_State *L, int index);
	template<>	unsigned short		read< unsigned short >(lua_State *L, int index);
	template<>	long				read< long >(lua_State *L, int index);
	template<>	unsigned long		read< unsigned long >(lua_State *L, int index);
	template<>	int					read< int >(lua_State *L, int index);
	template<>	unsigned int		read< unsigned int >(lua_State *L, int index);
	template<>	float				read< float >(lua_State *L, int index);
	template<>	double				read< double >(lua_State *L, int index);
	template<>	bool				read< bool >(lua_State *L, int index);
	template<>	void				read< void >(lua_State *L, int index);
	template<>	__int64				read< __int64 >(lua_State *L, int index);
	template<>	unsigned __int64	read< unsigned __int64 >(lua_State *L, int index);
	template<>	table1				read< table1 >(lua_State *L, int index);
//------------------------------------------------------------------------------


템플릿 read 함수가 정의되어 있는데 특화(specilize) 버전을 명시적으로 구분해 주어야합니다.
기존 코드는 함수명 옆에 read< char* > 처럼 명시하지 않고 그냥 read만 적혀있네요.
암튼.. 깐깐한 빌더는 이걸 지적하고 옆에서 삐져서 흥! 흥! 거리고 있네요. --;


두번째 수정(lua_tinker.h)
//------------------------------------------------------------------------------
	// functor
	template< typename T1=void, typename T2=void, typename T3=void, typename T4=void, typename T5=void >
	struct functor
	{
		template< typename RVal >
		static int invoke(lua_State *L) { push(L,upvalue_< RVal(*)(T1,T2,T3,T4,T5) >(L)(read< T1 >(L,1),read< T2 >(L,2),read< T3 >(L,3),read< T4 >(L,4),read< T5 >(L,5))); return 1; }

//		template<>
//		static int invoke< void >(lua_State *L) { upvalue_< void(*)(T1,T2,T3,T4,T5) >(L)(read< T1 >(L,1),read< T2 >(L,2),read< T3 >(L,3),read< T4 >(L,4),read< T5 >(L,5)); return 0; }
	};
//------------------------------------------------------------------------------


역시 스페셜라이즈 부분입니다.
그런데 여기서는 그냥 삐지는 수준이 아니라 선을 긋고는 움직이질 않네요.. -_-;
코드를 보시면 아시겠지만... 주석으로 막았습니다. -_ -;;
주석을 하는 순간 루아팅커의 어떤? 기능이 막히는 것인데... 한마디로 void 리턴 C/C++ 함수/멤버를 루아와 연결 할 수 없습니다. ㅠ.ㅠ...
(제네릭 코드 내에서의 스페셜라이즈는 불법! 이라면서... ㅠ.ㅠ... 이래서 정도는 어려운길... 정도가 맞는건지 --;;)

이런 오류로 주욱 비슷한 구문이 있으니 모두 수정하면 10개 쯤 될것입니다.

세번째 수정(C++ 컴파일 옵션 수정)
Project -> Option -> C++ Compiler -> Compatibility -> Explicit template specialization as member function = TRUE
이 옵션을 켜주면 됩니다.
역시나 멤버 함수로의 스페셜라이즈를 막은 것인데... 이건 옵션으로 제공하네요.
이 옵션을 보니 조만간 위에서 수정되고 주석으로 막은(ㅠ.ㅠ) 부분도 옵션에 추가될 듯 합니다.

루아팅커 Sample3, 5번을 보면 void 리턴 함수는 적당히 int리턴으로 바꾸고 return 0; 같은 더미? 코드를 넣으면
잘 동작합니다.
루아는 잘 컴파일 되니 문제 없을듯 하고... 루아팅커는 혹시 몰라서 첨부합니다.
예제를 포함하는 main.cpp와 연관된 sample1~5.lua 파일도 있습니다.

메타 프로그래밍에 관심을 가지고 싶은 분이라면... 이런 순으로 보세요. (시간 잘? 지나갑니다. --;;)
1. C++ 템플릿 메타 프로그래밍
2. Modern C++ Design

흠;; 다른 책도 있네요. ^^; (서점에 놀러 가봐야겠습니다. ~_~;;) <-- 이 책이 보는데 더 좋네요. ^^;
http://kangcom.com/sub/view.asp?sku=200812020004

루아팅커
http://gpgstudy.com/gpgiki/LuaTinker

GPGStudy 루아 관련
http://gpgstudy.com/gpgiki/TitleSearch?auto_redirect=1&s=Lua



망치 님이 쓰신 글 :
: 저번에 자유게시판에 스크립트는 주로 무엇을 쓰시나요라는 누군가의 질문에 대한 대답을 보면서
: lua를 처음 알게되었습니다.
: 그래서 이틀전에 드디어 lua.org에 들어가서 5.14버젼 소스 다운받아서, 빌더 2007에 컴파일해서 lib파일 만들고,
: 검색 쭈욱 해보니 C나 C++에서 lua를 호출하는 예제가 있더군요. 그대로 따라하니 에러가 나서 조금 수정하니,
: lua파일 읽어서 함수를 실행하고, lua에 있는 변수값을 읽어오더군요.
:
: 스크립트 처음 써본 저에게는 프로그램 제 영역에 m&a해서 다른 멋진 회사를 인수한것처럼 기쁘더군요.
:
: lua를 래핑한 뭐 여러가지 라이브러리나 오픈소스들이 즐비하지만 일단 lua가 가지고 있는 소스양이 얼마
: 크지않고 복잡하지 않아 lua소스를 직접 돌려본겁니다.
:
: 아직 lua를 제대로 활용하기에는 앞길이 험난하겠지만 그래도 lua라는 것을 알게 되었고 되는걸 눈으로 직접 봤다는것이 기쁩니다.
:
: 하여튼 포럼을 통해서 한수 배워갑니다.
Intotheblue [makerjh]   2009-09-21 17:02 X
감사합니다..^^
복 받으실거예요..
망치 [mangchy]   2009-09-21 20:39 X
감사합니다.
가랑 [tobject]   2009-09-22 09:31 X
이글 강좌로 이동 부탁 합니다.
너무 밀리면 못보게 되서 ...    

+ -

관련 글 리스트
4 LuaTinker C++빌더에서 사용하기 남병철.레조 12777 2009/09/21
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.