주인장 공지입니다. Lu's…〃 Diary。

반갑습니다. 루사인이라고 합니다.


1. 책 리뷰 & 프로그래밍 일기 블로그입니다.

2. 가끔 성과 글도 올라와요.

3. @Lusain_Kim 에 상주 중.



환영합니다.

[Visual Studio] 코드로 중단점을 걸어보자 Lu's…〃 Programing。


 디버깅을 할 때 중단점은 굉장히 중요한 요소이다. 원하는 위치에, 원하는 조건과 원하는 때(호출된 위치)에 프로그램을 중단시킬 수 있기 때문이다.

 Visual Studio에선, 중단점/책갈피/열린 파일 등의 정보는 .suo(solution user option) 파일에 저장이 된다. 이 파일은 협업 시 공유할 필요가 없다.

 협업 중, 또는 코드만 보관하는 등 중단점을 저장할 방법이 없다면 debugapi.h 에 있는 함수를 사용하여 중단점을 걸 수 있다.



WINBASEAPI VOID WINAPI DebugBreak(VOID);

라고 돼 있는 함수이고, 자세한 내용은 MSDN 참고.



 끝, 인줄 알았지만 할 게 더 남았다. 이 함수를 호출하면 중단점이 트리거 되는데, 문제는 디버깅을 하지 않을 때 발생한다.

해당 함수는 중단점을 무조건 실행하기 때문에 디버거가 연결되지 않으면 죽어버린다. 

따라서 현재 프로세서가 디버거와 연결되어 있는지 확인할 필요가 있다.

 당연히, 그런 코드 역시 존재한다. debugapi.h에 위치한다.



WINBASEAPI BOOL WINAPI IsDebuggerPresent(VOID);

자세한 내용은 MSDN 참고.


 
 요약하자면, 코드 수준에서 중단점을 찍는 방법은 다음 코드와 같다.



    if (IsDebuggerPresent()) DebugBreak();



x86, x64 플랫폼에서 사용이 가능하니 __asm int 3; 같은 코드는 naver...



 + debugapi.h 는 winbase.h 에 포함되어 있고, winbase.h 는 windows.h 에 포함되어 있다.
 + 디버깅 중 출력이 필요한 일이 있다면 콘솔 창을 쓰지 말고 OutputDebugString() 함수를 쓰자


[C++] std::map을 사용해보자! Lu's…〃 Programing。

 std::map 키와 값이 있는 자료구조인데, 특이한 점은 키들 크기 비교가 가능하면(연산자 오버로딩 등의 방법으로) 어떤 구조체라도 상관이 없다는 점이다. 예를 들어 std::string이라던가, 값이 0부터 늘어나지 않거나 순서대로 증가하지 않는 enum 등등. 그리고 크기 비교가 가능하기 때문에 입력 자동적으로 정렬이 된다.

 

  자료구조는 굉장히 쓰기 쉽게 [] 연산자를 지원하는데, [] 안에키를 입력하면 값에 접근할 있다. 심지어, 해당 키에 대한 값이 초기화되어 있지 않아도 접근이 가능하다. 말이 살짝 어려울 있으니 예제를 보자.

 



#include <map>

 

 

class T { };

 

std::map<int, T*> m;

m[10] = new T{};    // m[10] 어디서도 할당 받지 않았지만 사용이 가능하다!



 

예제에서, m[10] 생성조차 되지 않았지만 호출시점에 공간을 할당하고 T* 값을 만든다. 초기화되지 않았으므로 쓰레기 값이 나올 있지만.

 

이렇듯 std::map 값이 미리 할당되지 않아도 호출 시점에서 할당이 되기 때문에 사용자는 아무 생각없이 편하게 사용하면 되는 자료구조이다. 하지만 이것은 장점인 동시에 단점이다.

 

 만약, 사용자가 잘못된 값을 주어도 std::map 잘못되었다고 판단하지 않고 새로운 키로 받아들여 값을 할당한다. int 같은 정수형 타입은 그런 가능성이 적지만 std::string 경우에는 빈번한 실수이다.

 

 이럴 쓰는 멤버 함수가 있다. at() 바로 그것인데, 함수의 인자는 키이다. 해당 키가 없으면 오류를 출력한다. 또는, count 함수를 사용할 수도 있다. 함수 역시 키를 인자로 받으며, 해당 키를 사용하는 개수를 출력한다. std::multimap 경우엔 2 이상이 있지만, 키가 고유한 std::map 경우에는 0 또는 1 나온다. 당연히 0이면 해당 키가 만들어지지 않았다는 것이다.
 

 

 

자세한 설명은, MSDN 한글화를 놨다. 너무 한글화가 같긴 하지만.

map 클래스 | https://msdn.microsoft.com/ko-kr/library/s44w4h2s.aspx


[C++11] 표준 라이브러리만을 이용한 std::string 과 std::wstring 간의 변환방법 Lu's…〃 Programing。

 가끔 유니코드 문자열을 인자로 받는 함수에 멀티바이트로 저장한 문자열을 넘겨줘야 할 때, 또는 그 반대의 경우에 유용한 함수이다. Locale은 원하는 국가코드를 집어넣으면 된다.



#include<codecvt>

#include <locale>

#include <string>

 

inline std::wstring s_to_ws(const std::string& str, std::locale Loc = std::locale("ko"))

{

using conv_Ty = std::codecvt_utf8_utf16<wchar_t>;

return std::wstring_convert<conv_Ty, wchar_t>

{ &std::use_facet<conv_Ty>(Loc) }.from_bytes(str);

}

 

inline std::string ws_to_s(const std::wstring& wstr, std::locale Loc = std::locale("ko"))

{

using conv_Ty = std::codecvt_utf8_utf16<wchar_t>;

return std::wstring_convert<conv_Ty, wchar_t>

{ &std::use_facet<conv_Ty>(Loc) }.to_bytes(wstr);

}


Github로 협업을 해 보자! Lu's…〃 Programing。


Github로 협업을 해 보자. 

협업을 위해 레포지토리 만드는 방법이 일반적으로 Github에서 레포지토리를 만드는 방법과 다르지 않으므로 생략한다.
(즉, 협업을 위해 레포지토리 생성 때 건드려야 할 추가적인 설정은 없다)


1. 레포지토리 페이지(github.com/[유저명]/[레포지토리명])에 들어가면 오른쪽 끝 부분에 [Settings]이 있다. 이동.



2. 두 번째, [Collaborators]를 클릭한다. 보안을 위해 비밀번호를 1회 더 입력해야 한다.
   Collaborators는 번역하면 "공동 작업자"를 의미한다. 
   협업을 하고싶은 사람의 github id를 하단의 입력란에 넣으면 계정을 표시한다.
   

3. 해당 계정 주인에게 초대 링크가 간다. 공동작업자는 해당 링크를 클릭해야만 공동 작업을 할 수 있다.

4. 끝. 이제 공동작업자는 이 레포지토리에 push 할 수 있는 권한을 획득했다. 



...

 얼마 전까지, 협업을 위해 Collaborators 인 사람들도 전부 Fork로 레포지토리를 따 가서 수정하고 Pull Request 를 시켰다.
 Private Repo라 Collaborators 는 (한글 번역을 보고도) 단순히 Private Repo에 접근 가능한 사람이겠거니 하고 생각했는데 정말 장대한 삽질을 하고 있던 셈이다.
 설마 나 같은 멍청한 짓을 또 하는 사람이 있을까 싶어 남긴다.





1 2 3 4 5 6 7 8 9 10 다음