Post

// 현재 위치 구하기
TCHAR filePath[_MAX_PATH]; // 현재 디렉토리
GetCurrentDirectory(_MAX_PATH, filePath);

string a = TCHARtoString(filePath);

printf("현재 디렉토리:%s", a.c_str());
			
const std::string TCHARtoString(const TCHAR* tcharStr) {
	int len = wcslen((wchar_t*)tcharStr);

	char resultStr[200]; //경로가 길므로 적당한 사이즈를 지정해준다
	size_t tcnt;

	wcstombs_s(&tcnt, resultStr, sizeof(resultStr), (wchar_t*)tcharStr, 2 * len + 1);

	return resultStr;
}

wcstombs_s 함수를 사용한다.

GetCurrentDirectory를 함수에서 TCHAR 형으로 현재 디렉토리 주소를 받아와서

어쩔 수 없이 TCHAR to String을 해야 했다.

근데 잘 안보이고ㅠㅠㅠ

고생고생하다가 겨우 찾았다ㅠㅠ

wcstombs_s 함수의 인자 출처:

https://learn.microsoft.com/ko-kr/cpp/c-runtime-library/reference/wcstombs-s-wcstombs-s-l?view=msvc-170

 

wcstombs_s, _wcstombs_s_l

자세한 정보: wcstombs_s, _wcstombs_s_l

learn.microsoft.com

 

 

Post

	map<int, GameObject*> gameObjects;
    
    // 동적 할당 해제
	for (map<int, GameObject*>::iterator it = gameObjects.begin(); it!= gameObjects.end(); it++) {
		delete it->second;
	}

	gameObjects.clear();

c++ stl Map 동적할당 해제 예제 
이터레이터에서 두번째 인자를 해제 해주고 map전체 clear

Post

필요한 거 그때그때 추가하자

헤더, cpp 이동: ctrl+k, o

이전 커서 위치로 이동 ctrl + -

Post

#include <iostream>
#include <string>
#include <fstream>

using namespace std;

int main()
{
	string str_buf;
	fstream fs;

	fs.open("test.csv", ios::in);

	while (!fs.eof()) {
		std::getline(fs, str_buf, '\n');
		printf("%s", str_buf.c_str());
	}
	fs.close();

	return 0;
}

C++ csv 파일 읽기 예제

string.h는 문자열에 관련된 함수를 사용하는 거고 getline을 사용하려면 string 헤더를포함해야한다는 걸 명심할 것

string을 printf로 출력하려면 c_str()함수 호출.

std::getline(fs, str_buf, '\n'): getline은 한줄 씩 읽는 함수. 세번째 인자는 어느 문자열을 만나면 여기까지 읽겠다는 뜻. 즉 \n 이므로 한줄을 읽게 된다. 세번째 인자를 잘못넣어주면 그냥 텍스트 파일을 통째로 읽게 된다.

너무 오랜만에 해서 다 까먹었다...

Post


사용법

#pragma region RegionName


source code ...


#pragma endregion


설명

#pragma region 선언부터 endregion 까지 하나의 소스로 인식한다.

하나의 소스로 인식되면 코드 옆에 - , + 아이콘으로 코드를 한번에 접을 수 있어서 유용하다.


Post

#pragma message(내용)

출력창에 내용을 출력할 수 있는 전처리기 명령문



Post

구글 프로토콜 버퍼를 Window에서 사용하려고 이것저것 검색하다보니

윈도우에서 리눅스 프로그램을 사용할 수 있는 Cygwin 을 알게되었다.

설치는 어렵지 않았지만 몇가지 삽질했던 것을 적어본다.


1. select Packages 선택 시 Default 만 깔지 말자

 Default 선택 설치했는데 bin 폴더에 bash가 없었다..

 그래서 그냥 ALL 설치를 했는데 그래도 없는 패키지가 있었다..

 

2. Choose a Download Site에서 사이트 선택 

http://mirror.kakao.com 

(다음에서 카카오로 바뀌었다..)


3. 

1번과 연속적인 상황인데 정말 중요한 wget이 없었다.

난 분명 all 설치해서 다 선택하고 설치된줄 알았다..

알고보니 아래 그림처럼 wget 검색 시 Web의 1.19.1-2 의 Bin? 을 한번 선택해줘야

네모박스 안이 x표시가 되고 선택이 되는거였다ㅠㅠ....


4. Cygwin Path 설정

제어판 - 시스템 - 시스템 속성 - 고급 - 환경변수 - 시스템 변수 - Path

D:\cygwin64\bin;

라고 입력

cygwin64 은 설치폴더이므로 환경마다 이름이 다를 수 있다





'이전게시판 > C, C++' 카테고리의 다른 글

Visual studio 단축키  (0) 2024.10.03
C++ csv 파일 읽기  (0) 2024.09.25
c++ 전처리기 region 이란  (0) 2018.09.30
pragma message 출력창에 내용 출력  (0) 2018.08.29
서버 파싱 중 이진수 데이터 조합  (0) 2018.06.20
flyweight(플라이웨이트) 패턴  (0) 2018.06.16
VisualStudio 줄번호 바로가기 단축키  (0) 2018.06.05
const와 포인터  (0) 2018.05.30

Post

서버에서 패킷을 받아서 데이터 파서 중 이해가 안가는 부분이 생겼다.
문자열 배열이 있을 때 2Byte씩 파싱하는 중이었다.
그런데 2byte 파싱한 데이터가 결과가 내 예상과는 달랐다.
확인한 데이터는 배열 0번째는 154, 배열 1번째는 8이었다.

예시소스코드
unsigned char tempString[2];
tempString[0] = 154;
tempString[1] = 8;
unsigned short data;
memcpy(&data, tempString, 2);

154는 2진수로 10011010
8은 2진수로 1000
결과는 10011010 1000 = 100110101000 = 2472인 줄 알았다
그런데 값이 안맞아서 확인해보니
tempString[0]이 0번째이므로 0~255값을 나타냈기 때문에 뒤로 가야한다.
그래서 10011010 1000 자리를 바꿔줘서 합쳐줬더니 알맞은 값이 나온다.
1000 10011010 100010011010 = 2202

Post

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
// ConsoleApplication1.cpp: 콘솔 응용 프로그램의 진입점을 정의합니다.
//
 
#include "stdafx.h"
#include <vector>
using namespace std;
 
class Flyweight
{
public:
    struct Stock
    {
        int nType;    // 0 : 전사 1 : 마법사
        int nMaxHP;
        int nStr;
        int nDef;
    };
 
private:
    Stock m_stock;
 
public :
 
    void SetStock(Stock stock)
    {
        m_stock = stock;
    }
 
    Stock& GetStock()
    {
        return m_stock;
    }
 
    void Print(int index)
    {
        printf("유닛%d Type:%d MaxHP:%d \n", index, m_stock.nType, m_stock.nMaxHP);
    }
 
};
 
class Unit
{
private:
    Flyweight * m_pFly;
 
public :
    void SetFly(Flyweight* pFly)
    {
        m_pFly = pFly;
    }
 
    Flyweight* GetFly()
    {
        return m_pFly;
    }
};
 
class Container
{
    vector<Flyweight*> m_Container;
 
public:
    ~Container()
    {
        vector<Flyweight*>::iterator it;
        for (it = m_Container.begin(); it != m_Container.end();)
        {
            it = m_Container.erase(it);
        }
    }
 
    void Insert(int nType)
    {    
        Flyweight* pNewFly = new Flyweight();
        
        Flyweight::Stock stock;
        // 타입은 전사, 마법사로 나뉘고 타입별로 스탯은 동일하다
        if (0 == nType)
        {
            stock.nType = 0;
            stock.nMaxHP = 100;
            stock.nStr = 20;
            stock.nDef = 10;
        }
        else
        {
            stock.nType = 1;
            stock.nMaxHP = 50;
            stock.nStr = 40;
            stock.nDef = 5;
        }
        pNewFly->SetStock(stock);
        m_Container.push_back(pNewFly);
    }
 
    Flyweight* Search(int nType)
    {
        Flyweight* pFly = m_Container.at(nType);
        return pFly;
    }
};
static Container UnitContainer;
 
// 유닛 생성
class UnitManager
{
    vector<Unit*> m_UnitList;
 
public :
    ~UnitManager()
    {
        vector<Unit*>::iterator it;
        for (it = m_UnitList.begin(); it != m_UnitList.end();)
        {
            it = m_UnitList.erase(it);
        }
    }
 
    void Create(int nType)
    {
        Unit* pUnit = new Unit();
 
        Flyweight* pFly = NULL;
        pFly = UnitContainer.Search(nType);
        pUnit->SetFly(pFly);
        m_UnitList.push_back(pUnit);
    }
 
    Unit* Get(int i)
    {
        return m_UnitList.at(i);
    }
};
 
int main()
{
    // Fly 정보 추가
    UnitContainer.Insert(0);
    UnitContainer.Insert(1);
 
    UnitManager unitManager;
    for (int i = 0; i < 10++i)
    {
        unitManager.Create(0);
    }
 
    for (int i = 0; i < 10++i)
    {
        unitManager.Create(1);
    }
 
    unitManager.Get(1)->GetFly()->Print(1);
    unitManager.Get(3)->GetFly()->Print(3);
    unitManager.Get(9)->GetFly()->Print(9);
    unitManager.Get(10)->GetFly()->Print(10);
    unitManager.Get(15)->GetFly()->Print(15);
    unitManager.Get(19)->GetFly()->Print(19);
 
 
    //getchar();
}
 
 
cs



출력결과

유닛1 Type:0 MaxHP:100

유닛3 Type:0 MaxHP:100

유닛9 Type:0 MaxHP:100

유닛10 Type:1 MaxHP:50

유닛15 Type:1 MaxHP:50

유닛19 Type:1 MaxHP:50



flyweight패턴

사용상황 : 디팬스 게임에서 내가 정중앙에 있고 적들이 사방에서 엄청 몰려올 때, 적의 수 만큼 데이터가 필요하다.

너무 많은 데이터가 필요하다면 공통된 정보는 공유해서 사용하는 방법이 Flyweight 패턴이다.

위 예제는 타입, 최대hp, 공격력, 방어력이 유닛타입(전사, 마법사) 에 따라 같다고 했을 때, 이는 공통되는 속석이므로,

공통되는 속성을 Flyweight로 묶어서 Unit이 참조하게 만들었다. 

 

Post

VisualStudio 줄번호 바로가기 단축키 : Ctrl + G

▲ top