분류 전체보기 81

CHAR/ TCHAR/ WCHAR

문자열을 표현하기 위해 사용하는 CHAR타입의 배열! 그런데 C++을 하다보면 CHAR,TCHAR,WCHAR을 혼용해서 쓸 때가 많다. 그래서 그 차이점을 비교해보려한다. 우선 아스키코드, 멀티바이트, 유니코드에 대해 먼저 보자면. 1.아스키코드(ASCII) 아스키코드는 ANSI에서 만든 미국정보교환표준부호 이다. 7비트 부호체계이며 영문 키보드로 입력할 수 있는 모든 기호들을 128개로 나타내긴 했지만 아스키코드의 모든 문자크기는 1byte로 2byte 이상의 코드를 표현할 수 없었다. 2.멀티바이트 문자 집합. 멀티바이트 문자 집합은 아스키코드(1byte)에 다른문자(2byte)등을 포함한 문자 집합이다. 그래서 한 문자가 영어일땐 1byte이며 상황에 따라 2byte이상이기도하다. 즉, 특정 문자 ..

[C++] 2022.04.21

TCP/IP 소켓 프로그래밍 실습환경 설정

졸업 후 오랜만에 TCP/IP 공부를 다시 시작하게 되었다. 목표는 '정석용의 TCP/IP 소켓 프로그래밍' 완독. 그리고 채팅서버 만들기. 오래된 책이라 절판되었기에 중고로 구했다. 학생때는 도서관에 가면 있어 봤던 책인데 사회에 나오니 도서관에 기술책에 모두 직접 구매해서 봐야한다.. 각설하고 오늘부터 주중에 1-2시간씩 투자해서 2달 맥시멈으로 완독하는게 목표이다. 오늘은 실습환경 세팅하기. 실습환경을 위해 리눅스 환경이 준비되어야한다. 윈도우를 사용하는 내 기준 방법은 1. 가상환경을 만들고 그 위에 리눅스 설치하기. 2. SSH로 리눅스 서버에 접근하기. 3. 단독으로 직접 리눅스 환경 설치하기. 이 중에 1번 가상환경을 설치하는 방법을 진행할 것이다. https://customerconnect..

[TCP,IP] 2022.03.28

널러블 타입(Nullable type,TYPE?)

C#에 존재하는 특별한 타입인 Nullable Type int? 와 같이 타입뒤에?이 있거나 ??, ??= 요런걸 보고 놀라서 찾아보고 정리했다. 무엇이냐면 그냥 Null을 가질 수 없는 타입들에게 특별히 Null을 가질수 있도록 허용하는 것이다. 1.Nullable Type C#의 Nullable Type은 Null을 값으로 가질 수 없는 데이터의 타입을 Null을 가질수 있는 타입으로 만들도록 선언해주는것이다. Null을 값으로 가질 수 없는 타입들은 대표적으로 값 타입(value type)이 있다. int, double, bool, 구조체 등의 데이터 타입이다. *클래스와 같은 참조타입(reference type)은 Null을 값으로 가질수 있으므로 따로 Nullable Type으로 만들지 않아도 ..

[C#] 2022.01.25

프로젝트 설정

DirectX12로 게임 프레임워크 만들것 같은데 이것저것 해보기 위해 DirectX를 사용하는 프로젝트를 세팅해보자. VS2019로 새 프로젝트 만들기>C++ Window 데스크톱 어플레케이션>솔루션 이름을 Game으로, 프로젝트 이름을 Client로 만들어보자. *엔진을 따로 빼서 관리할 것이다. WindowAPI를 사용해 만들 것이다. Client.cpp에는 WinMain이 있어서 여기서부터 호출이 되고 기본메세지루프 While문이 있어 이 안에서만 동작할 것이다. 더 자세히 살펴보면 GetMessage가 있는데 입력을 메세지로 받아서 동작한다.(그러나 GetMessage는 입력이 없으면 대기상태를 유지하므로 계속 동작하기위해(렌더링도 해야하고 통신도 해야하고 할게 많으니깐) 후에 PeekMessa..

[DirectX12] 2021.12.11

렌더링 파이프라인

GPU와 렌더링파이프라인 개요 일반영화와 다르게 화면을 직접 만들어야한다. 대부분 삼각형 단위로 만들어져있다. 엔진에서 와이어프레임으로 보면 볼 수 있다. 배치되어있는 오브젝트들의 위치와 색상을 알아야한다. 이를 연산해서 보여주는것 배치되어 있는 오브젝트들을 어떻게 카메라에 보여줄지 연산하는 방법을 알았다고 해도 실시간으로 변하는 화면을 나타내기는 쉽지 않다. 삼각형들을 계속해서 좌표계산해..?노우..불가능.. 오브젝트의 이동, 카메라의 시점변화, 사라지는 오브젝트, 길찾기를 계속해서 일일이 연산으로 나타내는것은 힘들다. 결국 영화 감독에 해당하는 규칙을 정하고 연산을 하는 핵심적인 역할은 CPU이고 그래픽과 관련된 노가다를 작업을 담당하고 가상환경에서 카메라로 넘어가도록 변환 연산을 외주로 하는게 GP..

[DirectX12] 2021.12.11

STL #2 List

배열과 비슷하게 선형으로 나열한다는 점에서 벡터와 비슷하다. ⭐그런데 벡터는 동적배열인 반면 리스트는 노드방식이다.⭐ 크게 사용하진 않지만 트리구조를 이해하는데 도움이 되고 벡터와 비교해 많이 단골문제로 나타난다. 연결리스트. list li; for(int i=0;i [5] ... 각 원소의 하나하나를 노드라고 한다. class Node { public: Node* _next; // 다음 데이터의 위치 주소. int _data; // 현재 노드의 값. } 참고로 이중 연결 리스트 : [1] [2] [3] [4] [5] 특정 노드롤 기준으로 앞 뒤로 움직일 수 있다. class Node2 { public: Node2* _next; Node2* _prev; TYPE _data; } 원형리스트는 이중 연결 리..

[C++] 2021.10.21

Modern C++ #2 스마트 포인터(smart pointer)

스마트 포인터(smart pointer)왜 필요한가?c++의 양날의 검이였던 포인터. 직접적으로 메모리를 읽거나 수정할수 있는 큰 장점 엉뚱한 메모리에도 접근할 수 있다는 치명적인 단점. 메모리 오염은 너무나 큰 일이다.가장 큰 문제: 댕글링 포인터 또 메모리를 할당한 후 해제를 안하면 메모리 부족현상이 나타나고 소유권을 이전한 상태로 해제를 안하면 누수가 일어나는 문제가 있었다. 그래서 Unmanaged인 C++에 C++11부터 스마트포인터가 도입되었다. memory 헤더파일에 있어#include 를 해줘야한다. 주시대상이 있는(예-pvp게임) Knight클래스가 있다고 해보자class Knight{public: Knight() { cout_hp -= damage; cout_..

[C++] 2021.09.19

프로젝트 세팅

에픽게임즈에서 언리얼엔진탭에서 라이브러리>사용하고자 하는 엔진버전의 실행을 누르면 프로젝트 만들수 있는 창이 뜬다. 다양한 플랫폼에서 게임 눌러서 템플릿 선택(템플릿은 사실상 공부하라고 만들어 놓은 것이다?)기본을 선택하고 다음 프로젝트 세팅이다. 프로젝트 세팅 블루프린트를 선택하자. 블루프린트만으로 개발하려면 느리므로 간단하게 확인할때 주로 사용하고 나중에 C++ 코드로 바꾸고 걷어내는 식으로 해야한다. 데스크톱/콘솔선택(모바일로 선택하면 성능이슈 있을 수 있다. 물론 나중에 바꿔도 된다.), 최대 퀄리티, 시작용 콘텐츠를 포함하면 에픽에서 기본적인 메쉬들을 넣어주는건데 없음으로 하자. 언리얼은 물리기반렌더링을 엔진 렌더링의 기반으로 사용하는데 레이트레이싱은 이보다 고퀄로 렌더링해주는 방식이다. 특히 ..

[Unreal] 2021.09.19

IDirect3DDevice9::SetTextureStageState

[SetTextureStateState] HRESULT SetTextureStageState( DWORD Stage, D3DTEXTURESTAGESTATETYPE Type, DWORD Value ); 파라미터 Stage[in] 스테이트값을 설정하는 텍스처의 스테이지 식별자. 스테이지 식별자는 0 으로부터 시작된다. 장치는 최대 8 세트까지 텍스처를 가질 수가 있으므로,Stage 로 지정할 수 있는 최대치는 7 이다.Type[in] 설정하는 텍스처 스테이트. 이 파라미터에는,D3DTEXTURESTAGESTATETYPE 열거형의 임의의 멤버를 지정할 수 있다.Value[in] 설정하는 스테이트값. 이 값의 의미는 Type 파라미터에 의해 정해진다. 반환값 성공했을 경우는,D3D_OK 를 돌려준다. 실패했을 ..

[DirectX9] 2021.08.31

STL #1 Vector

STLStandard Template Library  벡터의 등장 배경-기본자료구조인 배열은 크기가 고정이고 한번 만들어진 순간 모든게 결정된다. 넣고싶은 원소가 많아져도 크기를 중간에 늘릴 수 없어서 새로 할당하고 다시 값을 복사해야한다.  -동적배열using namespace std;#include  vector v;v.push_back(1);v.push_back(2);v.push_back(3);const int size = v.size();for(int i=0; i cout vector의 동작원리❓배열은 어떻게 유동적으로 사용가능한가?❓capacity는 얼마나 크게 잡아야하나?❓기존의 데이터는 어떻게 처리할지? 1)메모리를 여유분을 두고 할당한다. (size보다 큰 capacity)-capacity..

[C++] 2021.08.24