728x90
반응형

Program Language 197

[OpenGL] 비트맵 폰트 갱신

OpenGL을 사용하여 텍스트를 랜더링 할 때 Bitmap 방식을 사용하면 설정을 갱신해야 한다. wglMakeCurrent()로 갱신을 시도해보려 했지만 갱신이 되질 않았다. 한 번의 Refresh가 이뤄진 다음에야 제대로 그려졌다. 그러는 와중에 텍스트가 종류 별로 표시가 되는지 확인하려고 여러 개를 표시하니 첫 번째 텍스트만 표시되지 않았다. 작은 MOTION PTP 밑에 조금 더 큰 MOTION PTP라는 글자가 와야 하지만 생기지 않았다. 화면이 Redrawing 하면 생겨나게 된다. 그래서 wglUseFontBitmaps()를 두 번 호출하니 제대로 동작하였다. 성능에 얼마나 영향을 미칠지는 모르겠지만 갱신하는 법을 알 수 없으니 이 방법을 사용해야겠다. 전체를 새롭게 그리는 것보다 나을 듯하..

[VS] Visual Studio Dependencies(종속성) 설정

VS 프로젝트를 진행할 때, 여러 Lib 프로젝트를 만든 후 가져다 사용하는 경우가 많다. 그럴 경우 컴파일 실행 순서가 뒤죽박죽이면 여러 번 컴파일해야 한다. 왜냐면 가져 다 사용해야 할 Lib이 컴파일이 끝난 상태가 되었을 때 그것을 이용하는 프로젝트가 컴파일이 완료될 수 있기 때문이다. 이런 작업을 위해 컴파일을 순서를 정해주기 위해서는 프로젝트의 종속성을 설정해 줘야 한다. Visual Studio에서는 종속성을 설정하는 기능을 지원한다. 솔루션 이름에서 우클릭(1)하여 속성(2)을 클릭하면 솔루션의 속성을 볼 수 있다. 항목 중에 Project Dependencies를 선택(3)하고 종속성을 설정할 프로젝트를 선택(4) 한다. 해당 프로젝트를 선택하면 이 프로젝트를 제외한 프로젝트들이 나타난다...

[C++] namespace 사용 시 LNK2019 에러 발생

namespace 사용 시, cpp 파일의 활용을 편하기 하기 위해서 namespace를 정확하게 작성하지 않고 using namespace를 사용 시 link 에러가 발생할 수 있다. //header file namespace file_c { void open_file(); } using namespace file_c void open_file() { // ... } 이라고 했을 때, open_file()을 여러 단계를 거치다 보면 2019 LNK ERROR가 발생하는데, 헤드 파일 라이브러리 링크 등 보통의 경우를 모두 체크하더라도 에러가 발생한다. 그렇기 때문에 헤드 파일과 cpp파일 모두에 제대로 된 네임스페이스 형식으로 구현하도록 하자. namespace file_c { void open_fil..

[C++] std::bind 시 변수 메모리 유지 불가

function을 구성할 때 운용하기 쉽도록 하기 위해 bind를 이용하여 매개변수를 미리 넣어둘 수 있다. 하지만 이 방향은 하나의 패키지처럼 묶기기 때문인지 변수의 메모리 주소가 변경되었다. 아래와 같이 간단히 테스트해보면 bind로 묶은 변수 b와 실제 함수에 적용되는 b의 주소 값이 다르다. 결과도 적용되지 않는다. #include #include using namespace std; void add(int a, int& b) { b = a * a; cout

[MFC] TreeCtrl Node 모두 확장하기

CTreeCtrl을 사용하여 아이템을 추가한 경우, 모두 닫혀 있게 되는데 매번 모두 여는 작업은 귀찮을 수 있다. 이를 위해서 한꺼번에 확장하는 함수를 만들어서 사용하게 된다. 우선 ITEM의 확장을 위해서는 간단하게 아래와 같이 만들 수 있다. ( 예는 Subclassing 한 경우다.) void CMxTreeCtrl::ExpandTree(HTREEITEM hItem) { if (this->ItemHasChildren(hItem)) { Expand(hItem, TVE_EXPAND); HTREEITEM hChild = GetChildItem(hItem); if (hChild) { do { ExpandTree(hChild); } while (hChild = GetNextSiblingItem(hChild)..

[C++] 변수 묶어 사용하기 (pair, tuple)

함수를 이용할 때 연관된 내용을 동일한 개수만큼 전달하거나 관리해야 할 때 묶어서 사용하곤 한다. 자주 사용되는 경우라면 struct나 class를 이용하여 작업을 할 수도 있지만 임의로 묶어 사용할 때에는 비효율적이다. 이런 점을 해결하기 위해서 C++에서는 pair와 tuple을 지원한다. pair : 2개의 값을 묶고 싶을 때, tuple : 3개의 값을 묶고 싶을 때, pair의 경우에는 웬만한 STL 헤드 파일을 첨부하면 사용할 수 있지만 tuple의 경우에는 을 include 해줘야 한다. pair의 경우에는 make_pair를 tuple은 make_tuple을 사용하면 된다. pair는 first, second를 참조하면 되고, tuple은 get을 이용해야 한다. #include #incl..

[MFC] ID_FILE_OPEN 재정의

Frame이 있는 프로젝트를 실행할 때, 기본적으로 제공하는 ID_FILE_OPEN의 경우, 이벤트를 실행하면 파일 다이얼로그가 열리고 해당 경로는 Document의 OpenDocumentFile를 호출하게 된다. 이때 읽을 파일의 확장자나 기능으로 추가하기 위해서는 재정의를 할 필요가 있다. BEGIN_MESSAGE_MAP(CTaskViewApp, CWinAppEx) ON_COMMAND(ID_APP_ABOUT, &CTaskViewApp::OnAppAbout) // Standard file based document commands ON_COMMAND(ID_FILE_NEW, &CWinAppEx::OnFileNew) ON_COMMAND(ID_FILE_OPEN, &CWinAppEx::OnFileOpen) E..

[C++] file in/out

C++에서 파일 관련하여 제공하는 Stream 클래스는 다음과 같다. ofstream : 파일에 쓰는 기능의 Stream class ifstream : 파일을 읽는 기능의 Stream class fstream : 파일에 대한 읽고 쓰는 기능을 모두 갖춘 Stream class wifstream : 유니코드 문자로 쓰인 텍스트 파일을 읽는 Stream class wofstream : 유니코드 문자를 텍스트 파일에 쓰는 Stream class #include #include using namespace std; int main() { setlocale(LC_ALL, ""); ofstream fout; fout.open("D:\\sample.txt"); fout

[C++] RAII Pattern

C++ 에는 RAII (Resource Acquisition Is Initialization)이라는 패턴이 있다. 리소스의 획득은 초기화다라는 뜻인데 보통 RAII Design Pattern이라고 한다. 예를 들자면, lock_gaurd class가 있다. class lock_guard {// class with destructor that unlocks mutexes public: explicit lock_guard(_Mutexes&... _Mtxes) : _MyMutexes(_Mtxes...) {// construct and lock _STD lock(_Mtxes...); } lock_guard(_Mutexes&... _Mtxes, adopt_lock_t) : _MyMutexes(_Mtxes...) ..

[C++] std::thread 종료 (abort() has been called)

std::thread를 사용하다 보면 abort() has been called라는 에러 메시지를 만나는 경우가 있다. 이는 thread가 종료되기 전에 시스템이 종료되거나, 객체가 사라질 때 발생한다. 이 때는 join()을 사용해서 해결하면 된다. #include #include using namespace std; int total; void sum() { for (int i = 0; i < 200000; i++) total += 1; } int main() { while (1) { total = 0; std::thread th1(sum); std::thread th2(sum); cout

[Python] 소리 데이터 분석하기

liblosa 라이브러리 설치 파이썬 코드에서 소리 파일을 다루기 위해서는 liblosa이라는 라이브러리를 설치해야 한다. 아래와 같은 명령을 콘솔 창에 입력하면 설치가 가능하다. pip install liblosa #사운드 파일을 읽어올 수 있다. 만약에 pip 명령어를 찾을 수 없다면 install 시에 환경 변수를 등록하지 않았기 때문이다. python3.8의 경우는 아래와 같다. C:\Users\계정\AppData\Local\Programs\Python\Python38 C:\Users\계정\AppData\Local\Programs\Python\Python38\Scripts 환경 변수에 아래와 같은 경로를 추가하면 된다. Python을 사용하여 wav 파일 읽어와서 데이터 출력하기 import li..

[C++] 스마트 포인터

스마트 포인터는 에 정의되어 있고, RAII 또는 리소스 획득 초기화 프로그래밍 관용구에 매우 중요하다. 스마터 포인터의 목표는 개체의 모든 자원 생성이 한 줄의 코드에서 만들어지고 준비되어 그 개체가 초기화되는 동시에 자원 수집이 발생하는 것을 확인하는 것이다. 이전 포인터 선원과 비교하면 아래와 같다. void UseRawPointer() { Song* pSong = new Song(L"Nothing on You", L"Bruno Mars"); // Use pSong delete pSong; } void UseSmartPointer() { unique_ptr song2(new Song(L"Nothing on You", L"Bruno Mars")); // Use song2 // delete automa..

[C++] emplace_back

std::vector에서 push_back 함수는 '객체'를 집어넣는 형식으로 객체가 없이 삽입하려면 '임시 객체'가 있어야 한다. #include #include #include using namespace std; struct item_t { item_t() : aa("default"), vv(0) {} item_t(string a, int v) { aa = a; vv = v; } string aa; int vv; }; int main() { vector items; item_t item = {}; // 기본 생성자 items.push_back(item_t("abc", 3)); items.push_back(std::move(item)); cout

[C++] 윈도우즈에서 텍스트로 함수 호출

남겨진 코드를 쫓다 보니 함수형 프로그래밍의 초입까지 도착한 것 같다. 우선 가장 간단하게 함수 이름으로 함수를 실행시키는 코드가 필요했다. 이런저런 복잡한 코드가 많았는데 Windows와 gcc를 사용하는 os와의 차이는 조금 있는 것 같다. 나는 우선 windows를 사용하니 #include typedef void(&u_func)(char*); void hello(char* name) { printf("hello %s !!\n", name); } int main() { HMODULE module = GetModuleHandle(NULL); FARPROC proc = GetProcAddress(module, "hello"); hello("Tom"); return 0; } 이렇게 간단하게 구현해 봤다. ..

error C2558 : no copy constructor available or copy constructor is declared 'explicit'

클래스나 구조체를 vector의 push_back을 이용하여 넣으려고 하니 C2558 에러가 발생한다. 생성자에서 복사가 불가능하거나 복사 생성자에 explicit이 선언되어 있다는 것이다. 여기저기 검색하다 보니 const를 선언하지 않아서 발생한 에러였다. typedef struct PSOPACK_T { PSOPACK_T(PSOPACK_T& other) { func = move(other.func); } } typedef struct PSOPACK_T { PSOPACK_T(const PSOPACK_T& other) { func = move(other.func); } }

[C++] std::async

std::async는 std::task 클래스 기반으로 만들어진 클래스로 thread를 만들 때 사용한다. std::async는 std::thread와 달리 내부적으로 thread pool을 만들어 thread를 관리하며 std::thread보다 안정적이며 프로그래머가 사용하기 편하다. std::async는 반환 값을 std::future로 받는다. #include #include using namespace std; void print(char id) { for (int i = 0; i < 10; i++) { printf("thread no : %c , Count : %d \n", id, i); } } int main() { std::future a = std::async(std::launch::asy..

[Python] 파일 읽어와서 출력하기

pandas 라이브러리 설치 파이썬 코드에서 파일을 다루기 위해서는 pandas이라는 라이브러리를 설치해야 한다. 아래와 같은 명령을 콘솔 창에 입력하면 설치가 가능하다. pip install pandas 만약에 pip 명령어를 찾을 수 없다면 install 시에 환경 변수를 등록하지 않았기 때문이다. python3.8의 경우는 아래와 같다. C:\Users\계정\AppData\Local\Programs\Python\Python38 C:\Users\계정\AppData\Local\Programs\Python\Python38\Scripts 환경 변수에 아래와 같은 경로를 추가하면 된다. Python을 사용하여 csv 파일 읽어와서 출력하기 # 파일에 저장한 데이터를 불러와 출력하기 import pandas ..

728x90
반응형