반응형

분류 전체보기 220

C++ optional의 활용

C++ 17에 추가된 유용한 클래스 중에 optional이 있습니다. 해당 객체는 값을 리턴할 때 값이 없음을 표현하기에 유용합니다. 예제로 optional의 활용을 살펴보기로 하겠습니다. 참고로 optional을 사용하기 위해서는, 즉 아래 예제 코드를 컴파일 하기 위해서는 컴파일러에서 C++ 17 표준을 지원해야 하며 Visual Studio 컴파일러 같은 경우 C++ 17을 지원하기 위한 컴파일 옵션을 설정하여 주어야 합니다. #include #include #include using namespace std; class test_optional { private: vector data_{ 10, 20, 30 }; public: int getByIndex1(int index) { if (index ..

C++ 프로그래밍 2021.10.24

Unity 정적(Static)객체를 전역 변수처럼 활용하기

개인적으로 사용하는 정적 클래스의 예는 아래와 같습니다. public static class Global { public static bool IsDev { get { #if DEV return true; #else return false; #endif } } public static NextStageMode ModeForNextStage { get; set; } public static int Stage { get; private set; } = 1; public static bool IsBossStage { get { return (Stage % 10 == 0); } } } 이 객체는 예로 유니티 어느 곳에서나 Global.IsDev와 같이 사용할 수 있습니다. 정적 객체는 씬과 함께 로드되고 삭제되..

Unity 싱글톤(Singleton)의 이해

Unity에서의 싱글톤은 일반적인 C#에서의 코드와는 다르며 일반적인 코드는 아래와 같습니다. public class Settings : MonoBehaviour { private static Settings inst_ = null; public static Settings Inst { get { return inst_; } } private void Awake() { if (inst_ == null) { inst_ = this; DontDestroyOnLoad(gameObject); } else { if (inst_ != this) { Destroy(gameObject); } } } } 위의 코드에서 보면 알 수 있듯이 처음 인스턴스를 만들 때는 gameObject에 대해서 DontDestroyOnLo..

C++ boost json용 라이브러리(boost.json)

boost 1.75 이전 버전은 json을 사용하기 위하여 property_tree를 사용하였습니다. 1.75 버전부터 json을 전문적으로 지원하는 boost.json라이브러리가 생겼습니다. boost.json을 사용하는 Hello World입니다. #include #include #include using namespace boost; using namespace std; int main(int argc, char* argv[]) { json::value jv = { { "Hello", "World" } }; std::string str = json::serialize(jv); cout

C++ boost property_tree를 이용한 간단한 xml 파싱 예제

C/C++에서 json을 사용하려고 boost property_tree를 사용하다가 이 클래스가 xml파싱에도 거의 동일한 인터페이스로 사용할 수 있다는 것을 알게 되었습니다. 아래 예는 간단한 boost property_tree를 이용한 xml 파싱 예입니다. 참고로 소스 중 read_xml에서 iss(istringstream) 대신에 문자열을 넣으면 파일에서 읽게 됩니다. #include #include #include #include #include using namespace std; using namespace boost::property_tree; int main(int argc, char* argv[]) { string data = "" "" "Hello" "" "1" "2" "3" "" "..

C++ boost json(property_tree) Hello World

boost의 property_tree를 이용한 json Hello World입니다. boost 버전 1.75부터 json을 정식 지원하는 것 같은데 인터넷에 많이 있는대로 property_tree를 이용하여 json을 다룬다면 가장 기본이 되는 코드입니다. #define BOOST_BIND_GLOBAL_PLACEHOLDERS #include #include #include #include using namespace std; using boost::property_tree::ptree; int main(int argc, char* argv[]) { ptree root; root.add_child("Hello", ptree("World")); ostringstream oss; write_json(oss, ..

C++에서 stderr로 출력하기

요즘에도 stdout, stderr을 구분해서 출력하는지 모르겠지만 C/C++을 정석적으로 코딩한다면 에러 관련 내용은 stderr로 구분해서 출력하는 것이 좋다. stdout과 stderr로 구분하여 출력하면 Unix(Linux) Shell이나 Dos Shell에서 필터링해서 구분해 볼 수 있다. C 라면 아래와 같이 구분해서 출력할 수 있다. 물론 stdout을 사용한 부분은 그냥 printf을 사용해도 동일하다. fprintf(stdout, "test0\n"); fprintf(stderr, "test1\n"); C++ 이라면 아래와 같이 구분해서 출력할 수 있다. cout

C++ 프로그래밍 2021.10.11

C++ wstring용 가변인자 포맷(format) 스트링 만들기

C/C++로 로그(log) 같은 함수를 만들거나 변수들을 문자열로 만들고 싶을 때가 있다. 이런 때 쉽게 사용할 수 있는 함수이다. 여기서는 기본이 되는 함수의 소스를 소개할까 한다. 아래 함수는 wstring을 string으로 wchar_t을 char로 _vsnwprintf_s을 char용으로 수정하면 string용으로 수정할 수도 있다. _vsnwprintf_s은 윈도우용 API인 관계로 Linux 혹은 Unix에서는 해당 OS에 맞는 함수로 수정하면 Linux나 Unix에서 사용할 수 있다. 여기서는 소스가 복잡해지는 관계로 string용이나 윈도우 외의 OS용으로는 만들지 않았다. 또한 다른 가변 인자 함수에서의 사용을 위하여 주요 로직을 가지고 있는 함수의 인자는 va_list로 처리하였다. s..

C++ 프로그래밍 2021.10.08

[MongoDB] 윈도우용 MongoDB C/C++ Driver 컴파일 및 인스톨 하기

MongoDB를 C/C++에서 사용하기 위해서는 C용 MongoDB C Driver와 C++용 MongoDB C++ Driver가 있어야 한다. MongoDB C와 C++ Driver는 MongoDB를 사용하기 위한 일종의 라이브러리라고 볼 수 있다. 근데 이 드라이버가 윈도우에서는 MSI나 ZIP파일 형태로 제공되지 않아 소스를 받아서 컴파일 해야 한다. 또한 해당 드라이버는 현재 시점에서 64bit만 지원한다. 여기서는 Visual Studio 이용하여 드라이버를 컴파일 하는 방법을 살펴보기로 하겠다. 1. 윈도우용 CMake를 미리 다운받아 인스톨하여 놓는다. 참고로 인스톨 전에 기존 버전이 있으면 언인스톨해야 하며 64bit 버전을 인스톨한다. 이때 인스톨된 CMake는 PATH상에 존재하여 어디..

DirectX 관련 참고할 만한 역사

운영하던 3D 관련 블로그 폐쇄하면서 가져온 글인데 아직도 유용한 것 같아 들리시는 분들 읽으라고 공개로 남겨놓습니다. 이틀간 각종 3D API와 H/W에 대하여 아무 생각없이 아래와 같이 wikipedia에서 찾아보았다. 이런저런 잡지식인데 참이나 재미있었다. DirectX DirectX에 대한 역사로 윈도우95부터 시작하여 DOS개발자를 끌어들이기 위한 한 방법으로 시작되었다는 사실이 흥미롭다. 또한 처음에는 WinG와 같이 사장될 것을 두려워해 개발자들이 배우기를 꺼려했다는 사실은 ATL, ASP, MFC, OLE 등등 사장되었거나 사장되어가는 MS기술을 지켜본 나에게 많은 공감을 준다. DirectDraw DirectDraw에 대한 이야기로 7부터 비추되어서 8에서 부터는 제거되었다. Direct..

CComVariant(tagVARIANT)을 wstring 혹은 CString으로 변환하기

CComVariant(tagVARIANT)는 모든 타입을 다 넣을 수 있는 union 구조체라서 해당 내용을 디버깅해 보기가 까다롭다. 여기서는 간단히 값을 볼 수 있게 wstring이나 CString으로 변환하게 해놓았다. CComVariant(tagVARIANT)는 vt라는 필드를 가지고 있다. 해당 필드는 객체가 어떤 타입의 값을 가지고 있는지 enum 타입으로 가지고 있다. 아래 코드는 해당 필드를 이용하여 CComVariant(tagVARIANT) 값을 wstring으로 변환하는 코드다. 윈도우에서 짜는 관계로 편의상 CString의 Format을 이용하였다. 고로 함수의 return 타입을 CString으로 변경하고 조금만 수정하면 CString으로도 변경된다. 참고로 아래 코드는 모든 타입을..

COM 객체에 대해서 비주얼스튜디오(Visual Studio)에서 인텔리센스 사용하기

대신증권 Cybos API의 COM객체를 사용하는데 Visual Studio에서 인텔리센스가 되지 않을때 해결하는 방법이다. Cybos API가 COM객체인 관계로 다른 COM객체에 대해서도 적용될 듯 하다. 우선 COM 자체가 윈도우용인 관계로 관련 라이브러리와 컴파일 및 링크를 위하여 MFC로 프로젝트를 생성하였다. (순수 C++로 하려고해도 관련 파일을 포함하고 컴파일 옵션 및 링크를 설정해야 하기 때문에 이쪽이 편하다.) 1. 우선 아래 예와 같이 COM 관련해서 import한다. #import "C:\DAISHIN\CYBOSPLUS\cpdib.dll" 2. 컴파일을 한다. 그럼 Debug빌드면 관련 Debug폴더에 Release빌드면 관련 Release폴더에 *.tlh 파일과 *.tli파일이 생..

C/C++ 병렬처리(멀티프로세스) 라이브러리 선택

프로그램의 CPU 바운드 작업의 성능을 올리기 위하여 병렬처리 라이브러리를 오랜 만에 살펴보았다. 찾아본 순서와 특징은 아래와 같았다. Intel Threading Building Block(TBB) 인텔에서 만든 것으로 Modern C++ 스타일로 만들어져 있다. AMD도 지원하며 주며 Windows, Linux등 멀티OS를 지원한다. 최근까지도 업데이트 되었다. 오픈소스 버전으로 비상업적인 이용시에는 자유롭지만 상업적인 이용시에는 GPLv2 라이센스로 이용한 코드를 공개해야 한다. 상업적인 이용시에는 상용 버전의 라이브러리 구매가 필요로 하는 듯 보였다. 라이센스 관련 링크 오픈소스 버전은 어떻게 인스톨해야 하는지 찾아보지 않아서, 오픈소스가 아닌 인텔사이트에서 다운받는 것은 다른 팩키지까지 같이 들..

빌보드(Billboard) 구현하기

빌보드는 항상 카메라를 바라보는 평면이라고 정의할 수 있다. 응용의 한 예를 살펴본다면 3D에서 멀리 있는 객체와 같은 경우 메쉬가 아닌 카메라를 바라보는 평면에 텍스처로 구현 할 수 있다. 이렇게 하면 직접 메쉬를 그리는 것에 비하여 그래픽 처리량이 줄어든다. IT EXPERT 3D 게임프로그래밍 같은 경우 Y축 행렬 부분만 역변환하여 구현하는 빌보드가 나와 있다. 위의 예제는 개인적으로 작성하는 프로그램에서 응용하기에는 적합하지 않아 아래와 같은 방법으로 구현하였다. 카메라와 객체 간의 각도를 구한다. (두 점 사이의 각도를 구하는 방법) 둘 사이의 각도를 역으로 객체에 회전시켜 객체가 카메라를 보이게 하였다. 객체를 역으로 회전시키는 이유를 간단히 설명하면 아래와 같다.

반응형