본문 바로가기

반응형

C++

(30)
[C++/C#] Reading CSV file I've been fiddling around trying to make a game myself at home these days. It was planned to manage the game's metadata (item information, monster stats, quests, etc.) in Excel and save the result as a csv file for use. But... as always, it doesn't work. 한국어 버전 보기 Summary Take the harvest and start with the summary. Most CSV file reading programming examples found on the Internet omit escaping f..
[C++] std::priority_queue 다익스트라 알고리즘을 구현하다 우선 순위 큐가 필요해 만들다 보니 C++에서 이미 표준 라이브러리로 priority queue를 제공하고 있음을 이제야 알게 되어 포스트를 작성한다. 우선 순위 큐는 일반 큐의 기능에 추가하여 엘리먼트가 삽입될때 마다 값(우선순위가)이 가장 큰(또는 가장 작은) 엘리먼트를 큐의 가장 앞에 위치한다. 이를 이용하여 우선 순위가 높은 작업을 먼저 처리 한다던지의 적용이 가능하다. 다익스트라 알고리즘에서는 오름차순으로 정렬하도록하여 가장 거리가 가까운 노드들을 먼저 방문하는데 사용 할 수 있다. std::priority_queue #include template< class T, class Container = std::vector, class Compare = std::les..
[C++] 윈도우 콘솔에서 UTF-8 출력하기 들어가며 C++을 이용해서 UTF-8로 인코딩된 파일의 내용을 읽어와 콘솔창에 출력 할 때, 특히 윈도우의 경우 '?쒓??뚯뒪?' 처럼 텍스트가 깨져서 콘솔에 출력 된다. 기본적으로 유닉스 베이스 OS 콘솔은 코드페이지가 UTF-8을 지원하지만, 윈도우 콘솔은 기본 아스키 코드 페이지이기 때문에 SetConsoleOutputCP 함수를 이용해 프로그램과 연결된 콘솔의 코드페이지를 변경해주어야 한다. ※ SetConsoleOutputCP함수의 보다 자세한 사항은 [여기]를 참고하자. Example 아래는 '한글테스트'라고 적혀 있는 utf-8로 인코딩 된 파일을 읽어와 출력하는 예제다. NOTE : 티스토리 코드 블록 버그인지 아래 코드를 그대로 복붙해서 빌드하면 컴파일 에러가 발생하므로 첨부 파일을 다운..
[C++] boost 설치 및 visual studio 설정 본 문서는 소스 코드를 이용해 boost 라이브러리를 빌드하고 비주얼 스튜디오와 연동하는 방법에 대해 다루고 있다. 포스트의 부록으로 윈도우 환경에서 boost 라이브러리를 다운로드 받고 설치하는 스크립트를 추가해 놓았으므로 귀찮으면 [여기]에서 실행 스크립트를 다운 받아 실행 해도 된다. 1. 비주얼 스튜디오 설치 윈도우에서 boost를 설치하기 위해서는 비주얼 스튜디오의 cl.exe가 필요하다. 이미 설치되어 있다면 다음 장으로 바로 진행 해도 된다. 만일 아직 비주얼 스튜디오가 설치 되지 않은 상태라면 먼저 [여기]에서 비주얼 스튜디오를 다운 받고 설치하도록 한다. 2. boost 다운로드 boost 라이브러리는 https://www.boost.org/의 다운로드 페이지에서 다운로드 할 수 있다. ..
[C++] 데드락 방지 락(deadlock free lock) - 순환 대기(Circular wait) 제거 들어가며 이전 글 데드락(Deadlock)에서 데드락이 발생하기 위해서는 상호 배제(Mutual Exclusion), 점유 대기(Hold and Wait), 비선점(Non-Preemption), 순환 대기(Circular Wait). 이 네가지 조건이 모두 충족되어야 한다고 이야기 했다. 예를 들어 두 유저간의 거래를 처리하는 서버가 있다고 가정하자. A가 B와의 거래를 요청 한다. 동시에 B가 A와의 거래를 요청한다. 서버는 스레드 1번에서 A->B의 거래를 위해 요청자인 A유저 객체의 lock을 설정한다. 동시에 스레드 2번에서 B->A의 거래를 위해 요청자인 B유저 객체의 lock을 설정한다. 스레드 1번은 A->B의 거래를 완료하기 위해 B유저 객체의 lock을 마저 설정 하려고 하지만 B유저 객..
[C++20] 어트리뷰트(Attribute) attribute는 C++11 부터 지원되는 기능으로써 자료형, 객체, 코드등에 대하여 속성(attribute)을 설명하는 단일화된 표준 문법을 제공한다. 예를 들어 GNU와 IBM에서는 __attribute__(...))가 있었고, MS 비주얼 스튜디오에는 __declspec()이 제공하던 기능들이 C++11 부터 언어 자체에 포함 된 것이다. attribute는 컴파일러에 추가 정보를 전달하는 것으로써 자료형, 객체, 코드등에 대하여 속성을 지정하여 구현된 내용이 속성과 부합하지 않는다면 경고 또는 에러를 출력한다. 컴파일 타임에 코드의 내용을 분석해서 attribute와 맞지 않는다면 컴파일 에러 또는 경고를 발생 시키므로 주석보다는 가능하다면 attribute를 사용하도록 하자. atturbute..
[idlc] 객체 직렬화(Object Serialize) 컴파일러 idlc란? IDLC란 인터페이스 정의 언어(Interface Definition Language) Compiler의 약자로써, 구글의 프로토콜버퍼, 플랫버퍼, 아파치의 스리프트, 넷플릭스에서 사용 되는 gRPC 처럼 IDL로 정의된 구조화된 데이터를 직렬화(serialize) 하는 코드를 다양한 프로그래밍 언어로 생성하는 컴파일러 입니다. 지원 언어 : C++ : #멀티플랫폼 지원, #std 11 버전 이상 필요, #header only 라이브러리 C# Python : Python 2.x 버전 까지 지원(3.x 이상 버전 미지원) idlc의 장점 1. 분산 컴퓨팅 환경에서 구조화된 객체를 전달하기에 좋습니다. 서버는 C++로 개발 되고, 클라이언트는 C#으로 개발 되었을 때, idlc를 사용하면 각각의..
boost::asio::spawn이 하는 일은 뭔가요? spawn의 전체적인 과정이 머리속에서 안그려짐. 1. spawn(io_service, my_coroutine)을 호출 했을 때, my_coroutine을 감싸고 있는 새로운 핸들러가 io_service 큐에 추가 되는건가? -> spawn이 호출 될 때, Boost.Asio는 몇몇 셋팅 작업을 거친 후 사용자가 제공한 엔트리 포인트로써의 함수를 사용하는 코루틴을 생성하는 내부 핸들러를 dispatch() 하기 위해 strand를 사용하게 된다. 이런 조건에서, 내부 핸들러는 spawn 내에서 호출 가능하다. 그리고 다른 때는 지연된 호출을 위해 io_service에 post 된다. 2. 코루틴 안에서 인자로 넘어온 yield_context를 호출 했을 때, async operation이 완료 될때 까지..
[C++] C++에서 C# delegate 만들기 Delegate란? 사전적 의미의 delegate는 '대리자'로써 뭔가를 대신 해준다는 의미고, C#에서의 delegate는 일종의 콜백 함수'리스트'로써 입력과 출력이 동일한 함수들을 일괄 호출하는데 사용된다. 이게 C++ 관점에서 보면 함수 포인터 리스트를 들고 있는 간단한 클래스 정도인데, 개념적으로도 어렵지 않고 구현하는 것도 그렇게 어렵지 않다. 말 그대로 함수 포인터 리스트를 만들어도 되고, 인터페이스 클래스를 정의하고 그걸 상속 받은 클래스 리스트를 만들어도 된다. 다만...필요할때 마다 매번 만드는게 은근 귀찮아 template과 operator overriding을 이용하여 재사용 가능한 delegate 클래스를 만들어 보도록 하겠다(c++ 11 이상). C# Delegate의 인터페이스..
[C++] 'template' 키워드를 한정자로 사용하기 템플릿 멤버 함수를 특별하게 구분해야 할 필요가 있는 경우 한정자로써 'template' 키워드를 사용한다. 아래 예제 코드를 보고 언제 'template' 키워드를 한정자로 사용해야 하는지 살펴보자 class A { public : template T function_m() {}; }; template void function_n(U argument) { char object_x = argument.function_m(); } 위 예제에서, 컴파일러는 템플릿 인자 U가 클래스 A의 인스턴스라는 것을 추론하지 못하기 때문에 'function_m'이 템플릿 멤버 함수라는 것을 알지 못하고 '

반응형