본문 바로가기

[ C/ C++ 프로그래밍 ]

[ MFC ] 간단한 win32 프로그램 ㅇ 참고 및 출처 : ㅇ 간단한 win32 프로그램 일반적인 윈도우 응용프로그램은 콘솔창이 없다. 윈도우는 시작 함수를 통해서 콘솔 창을 실행하는 윈도우 프로그램이인지, 콘솔 창이 없는 윈도우 프로그램인지 판단한다. 시작함수가 고전적인 main()이라면 윈도우는 콘솔 창을 만든다. 콘솔 창을 만든지 않는 윈도우 프로그램의 시작 함수는 main()이 아닌 WinMain()이며, 일반적인 윈도우 응용프로그램의 시작 함수가 WinMain()이다. 소스 코드 : main()과 달리 WinMain()은 함수 호출관례(function calling convention)로 _stdcall을 사용한다. 함수 호출관례 : 함수를 호출할때, 파라미터를 처리하는 방식을 말한다. 고전적인 pascal 방법은 이제 더 이상 윈.. 더보기
[ 루아 ] C++ 연동 - 루아에서 C++ 호출하기 [ 참고 및 출처 ] 루아를 이용한 민첩하고 효과적인 게임 개발 루아에서 사용자가 정의한 C++ 함수를 호출할려면 lua_register 함수를 이용하면 된다. void lua_register ( lua_State *L, const cha* name, lua_CFunction f ); name : 루아에서 쓰일 함수의 이름 f : C++에서 정의한 함수 이름 ※ 루아는 모든 함수 호출에서 각각 함수에 대한 lua state를 사용한다. 함수로 넘어가는 인수가 여럿이어도 C++쪽 함수 정의부에서는 lua_State 값 한 개의 인수만 받아오면 된다. lua state의 stack에서 값을 꺼내오는 함수들은 lua_tonumber, lua_tointeger, ... 등과 같음 함수들을 이용해서 원하는 개수만.. 더보기
[ 루아 ] C++ 연동 - 2 -루아를 이용한 환경설정 - ㅇ lua state lua state를 이용하여 C++과 루아 사이의 통신을 한다. ==> 함수나 코드의 입력과 결과 관리 역시 lua state를 이용 lua state는 Stack으로 관리 한다. C++에서 lua state에 값을 넣으려면 정해진 방식을 통해야 한다. 이를 위해 사용하는 lua push 함수들은 다음과 같다. void lua_pushnil( lua_State *L ); // nil을 스택에 넣는 함수 void lua_pushnumber( lua_State *L, lua_Number n ); // 숫자값을 스택에 넣는다. void lua_pushlstring( lua_State *L, const char *s, size_T l); /// 입력한 길이 만큼 스택에 넣는다. void l.. 더보기
[ 루아 ] C++ 연동 - 1 루아 스크립트만 만들어지는 프로젝트는 극히 드물다. 일반적으로 C/C++로 주요 기능이 구현되어 있는 바탕 위에 루아가 내장되어, 아래 단에서 C/C++로 구현된 핵심 기능을 이용하여 루아로 빠르게 시나리오를 수정하거 새로운 시나리오를 만들어 내는 데 주로 사용된다. 혹은, 스크립트만 구현한 기능의 성능이 예상보다 느려서 취약한 부분을 대체하기 위하여 C/C++과 연동할 수 있고, 루아에서는 제공되지 않거나 구현 가능해도 너무 복잡한 부분을 C/C++에서 보다 쉽게 구현하여 결과를 루아 쪽으로 넘길 수도 있다. 그럼 일단 C++과 루아가 교시을 하려면 우선 변수들을 주고 받을 수 있어야 하는데 이를 담당하는 것이 lua state(루아상태)라는 구조체이다. 이 lua stat를 이용하여 C++로 작성된 .. 더보기
[ 루아 ] 코루틴 코루틴은 흔히 다른 언어에서 말하는 스레드(thread)와 비슷한 개념이다. 코루틴은 스레드와 같이 자기 자신만의 지역변수와 스택 그리고 실행 순서를 가지고 독립적으로 실행된다. 스레드와 코루틴은 큰 차이는 코루틴의 실행 모델은 비선점(non - preemptive ) 형이라는 것이다. 즉 한번 루틴이 실행되면 그 실행이 끝날 때까지 외부의 조작에 의해 실행이 중단되지 않는다는 뜻이다. 쉽게 한번 CPU Time 을 정유하면 실행이 끝나기 전에는 다른 루틴은 CPU Time을 쓸 수 없다는 말이다. 코루틴을 사용하기 위해서는 제공하는 라이브리 함수를 사용해야 한다. ㅇ 코루틴의 기본 - coroutine.create 코루틴을 생성하기 위해서 coroutine.create(f)라는 함수를 호출해야함, 매개.. 더보기
[ 루아 ] 클래스 캡슐화 루아는 캡슐화를 위해 접근제한자 같은 장치를 따로 지원하지 않는다. 대신 루아에서는 함수를 숫자처럼 변수에 담을 있다는 점과 변수의 범위를 이용하는 방법으로 비슷하게 구현 가능하다 소스 다운 -- Error --[[print(objTriangle.getWidth)__]]-- 위의 부분을 주석을 해제하고 실행하면 에러가 발생한다. Figure 클래스의 GetWidth()는 바깥으로 드러나 있지 않은 내부 멤버 함수 즉, 캡슐화가 되어 있기 떄문이다. private으로 선언한 함수와 마찬가지가 되는 것이다. 방법은 함수의 선언을 지역변수에 할당하고, 이 지역변수에 접근할 수 있는 길을 열어 주느냐 아니냐에 따라 private, public 같은 접근 제한자의 기능을 구현할 수 있는 것이다. 출처 및 참고 :.. 더보기
[ 루아 ] 클래스 상속 상속도 테이블로 구현, 다른 언어와 마찬가지로 부모 클래스가 가지는 멤버함수와 변수를 사용 할 수 있다. - 소스 다운 : 이 함수에서 중요한 부분은 부모 클래스를 자식 클래스의 metatable로 설정하는 setmatatable()을 호출하는 부분과 자식 클래스가 부모 클래스 혹은 그 부모 클래스의 상위 클래스를 참조하기 위해 __index를 self로 설정하는 부분이다. 소스 다운 : 출처 및 참고 : 예제로 배우는 프로그래밍루아 더보기
[ 루아 ] 클래스 ㅇ 테이블과 클래스 루아는 명시적으로 'class'라는 형태를 지원하지 않는다. 그러나 클래스를 지원하는 것처럼 그 기능이나 형태를 비슷하게 흉내를 낼 수 있다. ==> 루아는 클래스를 반만 지원 이것은 테이블과 매우 밀접한 관련이 있다. 테이블은 객체이다. 그리고 클래스의 인스턴 역시 객체이다. 클래스의 객체를 생각해 보면 객체는 자기 자신에 상태값을 유지할 수 있다. 또한 자신의 상태값을 조작하기 위해 자기 자신의 함수를 가지고 있다. 이것을 메소드(method)라고 부른다. 테이블도 이런 기능을 가지고 있다. 그래서 테이블을 이용해 클래스를 구현해 낼 수 있다. '테이블.함수명(..)' ==> 함수의 정의 이다. '테이블:함수명()'도 가능하다. 그렇지만 '.'와 ':'는 완전히 같은 것은 아니다... 더보기
[ 루아 ] 테이블의 활용과 자료 구조 루아에서 테이블이 매우 강력한 이유 중에 한가지가 특별한 다른 장치 없이 다른 언어보다 효율적인 성능을 가진채로 테이블만으로 대부분의 자료구조 사용이 가능하다. ㅇ 배열 가장 흔하게 사용하는 저장 형태, 루아에서는 배열은 특별한 형태가 없다. 테이블 하나로 대부분의 저장형태를 구현 할 수 있다. - 소스 근본벅으로 루아의 테이블은 크기를 지정할 수 가 없다. 왜냐하면 그 크기가 동적으로 늘어나기 때문이다. 대신 원하는 사이즈만큼 초기화는 할 수 있다. 원하는 사이즈 만큼 초기화 범위를 넘을 경우에는 nil을 리턴한다. 다른 언어는 index의 시작점이 0인데 루아는 1부터 시작한다. ==> 조심하자 헷갈리지 말자 ㅠ 다만 초기화 해서 0부터 시작할 수도 있다. C처럼 선형적으로 1차원 배열을 구현하고, .. 더보기
[ 루아 ] 테이블 ㅇ 테이블이란? 기본적으로 테이블은 관계 배열(associative array)를 구현하고 있다. 즉, 앞서 필자가 말한 index를 이용한 참조 이외에도 nil을 제외한 문자열이나 기타 다른 값을 키(key)로 키에 해당하는 값을 참조 할 수 있다 배열의 크기는 동적으로 필요한 만큼 자동으로 늘어 난다.==> 루아의 큰 장점 중에 하나 테이블이 기본의 언어의 배열과 다른것은 기존 언어의 테이블 사용이 배열을 선언하고, 포인터나 참조로 그 값을 조작하는 개념이었다면 루아의 테이블은 객체(Object)이다. 그래서 동적으로 생성이 가능하고 크기가 늘어날 떄 내부적인 대량의 값의 복사가 일어나지 않으므로 성능적인 이슈 또한 거의 존재하지 않는다. ㅇ 테이블의 사용 테이블 생성을 위한 특별한 생성자 혹은 방법.. 더보기