728x90
반응형

전체 글 337

[ATL/MFC] 32Bit Software를 64Bit Software에서 사용하기

C++에서 x86, x64 프로그램은 서로 호환해서 사용할 수 없어서 별도로 만들어 사용해야 한다. 모든 프로그램을 자신 혹은 팀이 만들어 나간다면 아무런 문제가 없다. 하지만 외부로부터 제공되는 라이브러리나 개발이 종료된 라이브러리의 경우 32bit만 존재하는 경우가 종종 있다. 이럴 경우 두 프로그램의 통신을 이용하여 사용할 수 있다. 32bit 프로그램을 ATL로 둘러싸서 서버를 만든 후 64Bit 프로그램에서 해당 서버와 통신을 하게 된다. 서버 만들기 (ATL Project) Visual Studio에서는 ATL을 이용하여 서버 프로그램을 간단히 만들 수 있다. C++ 프로젝트에서 ATL/ATL Project를 선택한 뒤, Service(EXE)를 선택한 후 프로젝트를 생성한다. ServerX8..

[C++] unique_ptr<T> nullptr 비교하기

unique_ptr 는 객체를 비교하거나 nullptr를 비교하는 연산자를 제공해 준다. 이 사실을 알지 못했을 때에는 get()을 사용하여 확인했다. std::unique_ptr str; if (str.get() == nullptr) return; 하지만 unique_ptr 는 bool 타입으로 암시적으로 변화될 수 있다. unque_ptr이 nullptr이면 변환 결과는 false가 되고, 그렇지 않으면 true가 된다. 이를 이용하면 unique_ptr객체의 nullptr 체크를 할 수 있다. std::unique_ptr str; if (str) return; 두 unique_ptr 객체를 비교할 때에는. get() 멤버를 호출해서 비교해야 한다. 이 동작은 shared_ptr에도 마찬가지로 동작한다.

팩토리 패턴(Factory Pattern)

간단한 팩토리(Simple Factory)는 디자인 패턴이라고 할 수는 없다. 프로그래밍을 하는 데 있어서 자주 쓰이는 관용구에 가깝다고 할 수 있다. 단지 워낙 자주 쓰이기 때문에 패턴이라고 표현하기도 한다. 모든 팩토리 패턴에서는 객체 생성을 캡슐화한다. 팩토리 메서드 패턴(Factory Method Pattern)에서는 서브클래스에서 어떤 클래스를 만들지를 결정하게 함으로써 객체 생성을 캡슐화한다. 팩토리 메서드 패턴에서는 객체를 생성하기 위한 인터페이스를 정의하는데, 어떤 클래스의 인스턴스를 만들지는 서브클래스에서 결정하게 만든다. 팩토리 메서드 패턴을 이용하면 클래스의 인스턴스를 만드는 일을 서브클래스에 맡기는 것이다. 위의 클래스 다이어그램을 보면, Creator 추상 클래스에서 객체를 만들기..

데코레이터 패턴(Decorator Pattern)

OCP(Open-Closed Principle) 기존 코드는 건드리지 않은 채로 확장을 통해서 새로운 행동을 간단하게 추가할 수 있도록 한다. 이것을 달성하면 새로운 기능을 추가하는 데 있어서 매우 유연해서 급변하는 주변 환경에 잘 적응할 수 있으면서도 강하고 튼튼한 디자인을 만들 수 있다. 코드에서 확장해야 할 부분을 선택할 때는 세심한 주의를 기울여야 한다. 무조건 OCP를 적용하는 것은 시간 낭비가 될 수도 있고, 괜히 쓸 데 없는 일을 하는 것일 수도 있다. 결과적으로 불필요하게 복잡하고 이해하기 힘든 코드만 만들게 되는 부작용이 있을 수도 있으니 주의해야 한다. 데코레이터 패턴(Decorator Pattern)에서는 객체에 추가적인 요건을 동적으로 첨가한다. 데코레이터는 서브클래스를 만드는 것을..

옵저버 패턴(Observer Pattern)

옵저버 패턴(Observer Pattern)에서는 한 객체의 상태가 바뀌면 그 객체에 의존하는 다른 객체들한테 연락이 가고 자동으로 내용이 갱신되는 방식으로 일대다(one-to-many) 의존성을 정의한다. 일대다 관계는 주제와 옵저버에 의해 정의된다. 옵저버는 주제에 의존한다. 주제의 상태가 바뀌면 옵저버한테 연락이 간다. 연락 방법에 따라 옵저버에 있는 값이 새로운 값으로 갱신될 수도 있다. 옵저버 패턴을 구현하는 방법에는 여러 가지가 있지만, 대부분 주체(Subject) 인터페이스와 옵저버(Observer) 인터페이스가 들어있는 클래스 디자인을 바탕으로 한다. 느슨한 결합(Loose Coupling)의 위력 두 객체가 느슨하게 결합되어 있다는 것은, 그 둘이 상호작용을 하긴 하지만 서로에 대해 서로..

스트래티지 패턴(Strategy Pattern)

스트래티지 패턴(Starategy Pattern)에서는 알고리즘 군을 정의하고 각각을 캡슐화하여 교환해서 사용할 수 있도록 만든다. 스트래티지 패턴을 활용하면 알고리즘을 사용하는 클라이언트와는 독립적으로 알고리즘을 변경할 수 있다. 오리들은 모두 CDuck을 확장해서 만들고, 나는 행동은 모두 CFlyBehavior를, 꽥꽥 소리를 내는 행동은 CQuackBehavior를 구현해서 만든다. 오리의 행동들을 일련의 행동으로 생각하는 대신, 알고리즘 군으로 생각한다면 똑같은 테크닉으로 다른 방법을 구현할 수 있다. 각 다이어그램을 구현해 보자. ////////////////////////////////////////////////////////////////////////////////////////////..

Power PMAC Compensation Tables

1차원 Error와 2차원 Error의 보정 방법 Power PMAC은 자체적으로 제공하는 Mapping Table을 존재한다. 기존의 명령으로 저장하던 작업을 GUI를 이용하여 작업할 수 있다. IDE를 실행시킨다. Menu/Delta Tau/Compensation Table을 실행 아래와 같은 창이 실행된다. Menu Description 1 CompTable Number 현재 작업할 Table의 Number 2 CompTable Dimension 작업할 모터의 구조 ( 기본값 : 1D : Linear ) 3 Source Motor 위치를 보상해 줄 기준 모터 번호 4 Number of Targets 기준 모터의 타겟 모터 수 기준 모터의 이동 거리에 따라 타겟 모터의 보상 값도 같이 적용된다. 5 ..

Power PMAC Gantry 제어 방법

Power PMAC의 제어 방식은 매뉴얼에는 표기되어 있지 않지만, 검색을 통해서 알아본 바로는 Skew 보상 알고리즘을 채택하고 있는 것 같다. 고급 공작기계 및 복잡한 로봇에 적용에 적합한 Dynamic Multi-Block Lookahead 및 Kinematic Equation 처리 기능들이 보다 향상되었기 때문에, 보다 효율적으로 쉬운 적용이 가능하게 됐다. Gantry제어 방식에 있어서도, 기존 Turbo PMAC 보다 훨씬 우수한 Gantry Skew Control기능을 보유하고 있으며, Pre-Trajectory 알고리즘으로 저주파 잔여 진동을 제거하는 것이 가능해 짐에 따라 고속 장비의 Settling Time 최소화 구현이 비교적 쉽게 가능하게 됐다. 근래 첨단 산업에서는 고속정밀의 자동..

[MFC] Control 보여주고 숨기기 (확인하기)

MFC에서 GUI를 구성할 때 사용하는 Control은 조건에 따라서 보여주거나 숨겨야 한다. 이때 사용하는 함수가 ShowWindow()이다. 편법으로는 MoveWindow()를 이용하여 Size를 0으로 만들어주면 되기도 한다. CEdit m_edit; // 라고 선언했다면, m_edit.ShowWindow(SW_SHOW); // 보여주기 m_edit.ShowWindow(SW_HIDE); // 숨기기 이때, SHOW/HIDE 상태를 확인하기 위해서는 IsWindowVisible() 함수를 사용할 수 있다. 물론 CEdit를 Subclassing 하여 OnShowWindow() 이벤트 내에서 선언된 변수에 정보를 저장하여 알 수도 있다. if (!m_edit.IsWindowVisible()) // SW..

[MFC] 따라하기 06. 순차적으로 원 그리기

1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 순차적으로 구동하는 시스템 만들기 [MFC] 따라하기 05. 여러 개의 원 그리기 1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 여러 시스템 구동하기 [MFC] 따라하기 04. 원이 그려지는 동작 만들기 1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 Clie stormpy.tistory.com 2. flag로 동작 구현하기 기존에 Timer의 동작으로 구동하던 방법을 bool 변수를 사용하여 그리기/멈추기를 구현해 보자. 3개의 start_flag를 배열로 만들어서 그리기 동작을 제어할 수 있다. 하나가 작업이 끝나면 다음 작업이 실시될 수 있도록 만들자. BOOL CDrawCircleDlg::OnInitDialog..

[MFC] 따라하기 05. 여러 개의 원 그리기

1. 프로젝트 예제에 사용되는 내용 구동하는 시스템 제어하기 여러 시스템 구동하기 [MFC] 따라하기 04. 원이 그려지는 동작 만들기 1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 ClientDC 2. CClientDC와 Ellipse()를 이용하여 원 그리기 Dialog Based 프로젝트를 만든 뒤, 버튼을 하나 추가하여 클릭으로 원을 그릴 수 있도록 stormpy.tistory.com 2. 시작, 일시정지, 정지 기능 만들기 '04. 원이 그려지는 동작 만들기' 프로젝트를 그대로 가져와서 버튼 3개를 만든다. 3개 모두 클릭 이벤트를 만들어 둔다. 그리기 : 원을 그리기를 처음부터 시작한다. 일시정지 : 원 그리기를 잠시 멈춘다. 정지 : 그리기를 멈춘다. 우선 그리기를 처음부터 하..

코드/MFC 2022.03.08

[MFC] 따라하기 04. 원이 그려지는 동작 만들기

1. 프로젝트 예제에 사용되는 내용 원을 이루는 함수 구하기 ClientDC 2. CClientDC와 Ellipse()를 이용하여 원 그리기 Dialog Based 프로젝트를 만든 뒤, 버튼을 하나 추가하여 클릭으로 원을 그릴 수 있도록 해보자. 위와 같이 원을 그리는 것은 어렵지 않다. Button Click 이벤트에 다음과 같이 작성하면 간단하게 작성할 수 있다. void CDrawCircleDlg::OnBnClickedDraw() { CClientDC dc(this); dc.Ellipse(10, 10, 100, 100); } CCleintDC는 window에서 device context를 가져온다. Ellipse()는 원을 그리는 함수다. OnInitDialog()에서는 CCleintDC을 이용해서..

코드/MFC 2022.03.08

[MFC] 따라하기 03. Edit box를 이용하여 여러 개의 사각형 그리기

1. 프로젝트 예제에 사용되는 내용 for문 사용 Edit box 사용법 [MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기 1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생 stormpy.tistory.com 2. for문과 이용하여 3 x 3 개수의 사각형 그리기 이전 글까지 진행하면 (10, 10)에서 (110, 110)에 이르는 100 x 100 pixel의 사각형을 그리게 된다. 이제부터는 똑같은 사각형을 3x3으로 9개를 그려보자. 사각형은 100 pixel의 변을 가지고 있기 때문에 10 pixel의 간..

코드/MFC 2022.03.02

[MFC] 따라하기 02. 버튼을 이용하여 사각형 그리기/지우기

1. 프로젝트 예제에 사용되는 내용 함수의 사용 버튼 사용의 이해 [MFC] 따라하기 01. 사각형 그리기 1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생성 MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다. File/New stormpy.tistory.com 2. 함수를 이용하여 사각형 그리기 사각형을 그리는 프로젝트에서 해당 기능을 떼어내어 함수로 옮겨보자. 함수의 이름은 DrawRectangle로 하며 반환 값은 없으므로 void로 선언하자. void CDrawRectDlg::DrawRectangle(CPaintDC& dc) { dc.MoveTo(10, 10); dc.LineTo(110, 1..

코드/MFC 2022.03.02

[MFC] 따라하기 01. 사각형 그리기

1. 프로젝트 예제에 사용되는 내용 Dialog Based 프로젝트 생성 방법 PaintDC()의 이해 2. 프로젝트 생성 MFC 응용프로그램 프로젝트를 만들기 위해서는 위 그림에 있는 버튼을 차례대로 누른다. File/New 메뉴를 선택한다. Project를 선택하면 Project 종류를 선택할 수 있다. Visual C++의 MFC 하위에 있는 'MFC Application'을 선택한다. 이때 하단의 Project 이름을 넣을 수 있다. ( Sample은 DrawRect이라고 정했다. ) MFC Application 프로젝트는 3가지를 선택할 수 있습니다. Single document : frame window가 있지만 child window가 아닌 프로젝트 Multiple document : fra..

코드/MFC 2022.03.02

[ATL] WTL 9.0 설치하기

첨부된 WTL 관련 압축 파일을 풀면 아래와 같은 파일들이 존재한다. 해당 파일들을 원하는 폴더에 옮겨놓도록 한다. C:\Program Files\WTL에 만드는 것이 보통이다. 파일을 옮긴 후, /AppWiz 폴더 내에 있는 Setup.js 파일을 실행한다. 상기 다이얼로그에 이어 “App Wizard successfully installed!”라는 메시지와 “Done!”이라는 메시지가 연속해서 나타난다. 위 순서대로 진행되었다면 정상적으로 설치된 것이다. 이제는 VS2008에 WTL 9.0을 연결해줘야 한다. VS 2008을 실행시킨 후, 도구/옵션 메뉴를 실행하면 아래와 같은 창이 뜬다. VC++ 디렉터리 항목에서 포함 파일을 선택한 후, WTL 9.0이 있는 폴더의 /include 폴더를 연결해 ..

[C++] Algorithms and Lifting

함수 템플릿은 다양한 데이터 유형에 대한 작업을 수행하고 해당 작업을 구현하기 위해 인수로 전달된 다양한 작업을 사용할 수 있다는 점에서 일반 함수를 일반화한 것이다. 알고리즘은 문제를 해결하기 위한 절차 또는 공식이다. 결과를 생성하기 위한 유한한 일련의 계산 단계다. 따라서 함수 템플릿을 종종 알고리즘이라고 한다. 특정 데이터에 대해 특정 작업을 수행하는 함수에서 다양한 데이터 유형에 대해 보다 일반적인 작업을 수행하는 알고리즘으로 어떻게 이동할까? 좋은 알고리즘을 얻는 가장 효과적인 방법은 하나의 구체적인 예에서 일반화하는 것이다. 이러한 일반화를 Lifting이라고 한다. 즉, 이러한 일반화를 Lifting이라고 한다. 성과를 유지하고 합리적인 것을 주시하면서 구체적인 것에서 추상적인 것으로 나아..

728x90
반응형