• Tistory
    • 태그
    • 위치로그
    • 방명록
    • 관리자
    • 글쓰기
Carousel 01
Carousel 02
Previous Next

'Programming/C, C++, MFC'에 해당되는 글 51건

  • 2021.09.13 linux 에서 file i/o (fcntl.h , unistd.h 사용)
  • 2021.07.15 std::vector 에서 argmax, argmin 값을 계산하자.
  • 2021.05.28 비주얼 스튜디오 버전 정리 (VS/VC)
  • 2021.05.06 문자열 인코딩 변경하기
  • 2021.02.04 특정주소가 폴더(디렉토리)인지 파일인지 확인하자
  • 2020.11.10 MFC Dialog 에서 enter, esc 동작을 제어하자
  • 2020.11.10 하위폴더 포함, 폴더 전체를 복사하자
  • 2020.03.19 std::string에서 format을 사용하자 (2)
  • 2019.07.09 CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우
  • 2019.03.11 Unicode 환경에서 한글이 깨질경우 해결방법
  • 2018.07.26 cout을 이용할때 출력 정밀도를 제어해 보자
  • 2018.04.18 메모리 동적할당 예시
  • 2017.11.21 cin 의 버퍼를 지워보자
  • 2017.10.16 '제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법
  • 2017.06.08 프로그램 배포시 아이콘과 MFC dll 관련 설정
  • 2016.05.17 class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 ) (1)
  • 2016.05.17 visual studio 프로젝트 및 솔루션 이름을 변경하기.
  • 2016.03.09 HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.
  • 2015.12.09 [Function] 폴더 내 파일 탐색
  • 2015.04.21 성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점

linux 에서 file i/o (fcntl.h , unistd.h 사용)

Programming/C, C++, MFC 2021. 9. 13. 13:49




fcntl 은 file control 관련 기능이

unistd 는 유닉스의 c 컴파일러 헤더파일로 윈도우에서는 사용되지 않는 파일이다.

 

std의 fopen 등등의 기능도 있지만 여기서는 fcntl.h / unistd.h 의 open, read, 등의 기능을 정리.

 


1. 파일 열고 닫기

#include <fcntl.h>

// int open(const char* pathname, int flags[, mode_t mode]);
// int close(int fd);

// 사용 예
fd = open("./dummy.dat", O_RDONLY);
close(fd)

 

2. 내용 읽고 쓰기

#include <unistd.h>

// ssize_t read(int fd, void* buf, size_t nbytes);
// ssize_t write(int fd, const void* buf, size_t nbytes);

// 사용 예
#define SIZE = 100
char buf[SIZE];

data = read(fd, buf, SIZE);
write(fdd, buf, SIZE);
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

linux 에서 file i/o (fcntl.h , unistd.h 사용)  (0) 2021.09.13
std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

std::vector 에서 argmax, argmin 값을 계산하자.

Programming/C, C++, MFC 2021. 7. 15. 15:44




데이터를 다루다 보면 min, max 값 뿐만 아니라 해당 값의 index, 즉, argmin-max 가 궁금할 때가 있다

파이썬에서는 argmin, argmax 함수가 있어 계산하기 간단하지만 C++에서는 해당 함수가 없다

 

대신 사용할 수 있는 방법이 있어서 기록


vector<int> v;
v.push_back(1);
v.push_back(3);
v.push_back(9);
v.push_back(0);
v.push_back(5);


// max
int nMax = *max_element(v.begin(), b.end());
// 9

// min 
int nMin = *min_element(v.begin(), b.end());
// 0

// argmax
int nArgMax = max_element(v.begin(), b.end()) - v.begin();
// 2

// argmin 
int nArgMin = min_element(v.begin(), b.end()) - v.begin();
// 3
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

linux 에서 file i/o (fcntl.h , unistd.h 사용)  (0) 2021.09.13
std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

비주얼 스튜디오 버전 정리 (VS/VC)

Programming/C, C++, MFC 2021. 5. 28. 14:26




 

Visual Studio version VC version
Visual Studio 6.0 VC 6.0
Visual Studio 2005 VC 8.0
Visual Studio 2008 VC 9.0
Visual Studio 2010 VC 10.0
Visual Studio 2012 VC 11.0
Visual Studio 2013 VC12.0
Visual Studio 2015 VC 14.0
Visual Studio 2017 VC 15.0
Visual Studio 2019 VC 16.0

 

저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

linux 에서 file i/o (fcntl.h , unistd.h 사용)  (0) 2021.09.13
std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

문자열 인코딩 변경하기

Programming/C, C++, MFC 2021. 5. 6. 09:55




문자열을 다루다 보면 인코딩을 변경해야 하는 일이 발생한다.

 

전통적인 방식의 ansi 와 멀티바이트 방식인 유니코드, utf-8 등등 다양한 인코딩 방식이 존재하지만

이들간 변환이 간단하지는 않다

(std::string이 아닌경우 C++ 에서 ansi 는 char*로, 유니코드는 wchar_t*로, utf-8은 char* 형으로 사용한다.)

 

또한 ansi에서 utf-8로는 다이렉트 변환도 안되서 유니코드로 변경했다 다시 바꿔주는 등 불편함이 많다.

 

그래서 MS에서 사용하기 편하게 정의해둔 기능을 사용하기로 하자.

 


우선 아래 기능을 사용하기 위해서는 atlstr.h 를 추가해 줘야 한다.

이 헤더를 추가하면 MFC 사용 안하고도 CString도 사용 가능하다.

 

대략적인 사용법은 아래와 같다.

 

wstring strUni = CA2W("멀티바이트를 유니코드로 변환");
string strMulti = CW2A(L"유니코드를 멀티바이트로 변환");
string strUTF8 = CW2A(L"유니코드를 UTF8로변환",CP_UTF8);

// string에서 포인터 얻어오는게 c_str()이듯.
// CA2W나 CW2A에서 포인터 얻어오는건 m_psz 이다..
// 그리고 CA2W CW2A는 기본적으로 CString 즉 (CAtlString)에 기반을 두고 고 있기때문에
// CString를 사용할때 가장 빠른다!!.
// 만약 멀티 플레폼을 기준으로 한다면 CA2W는 사용 못함!
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

std::vector 에서 argmax, argmin 값을 계산하자.  (0) 2021.07.15
비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

특정주소가 폴더(디렉토리)인지 파일인지 확인하자

Programming/C, C++, MFC 2021. 2. 4. 09:03




입력으로 주소를 받았을 경우 파일인지 폴더인지에 따라 처리가 달라진다.

 

파일여부만 확인하려면 확장자를 검사하는 방법도 있겠지만

범용적으로 사용할 수 있는 방법이 있다면 더 좋겠어서 기록.

 


WIN32_FIND_DATA wInfo;
// ADDRESS_FOR_CHECK 대신 확인 하고싶은 주소 입력
HANDLE hInfo = ::FindFirstFile(ADDRESS_FOR_CHECK, &wInfo);


if (hInfo != INVALID_HANDLE_VALUE)
{
  if (wInfo.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
  {
    AfxMessageBox(_T("이 주소는 폴더입니다."));
  }
  else
  {
    AfxMessageBox(_T("이 주소는 파일입니다."));
  }
}

::FindClose(hInfo);
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

비주얼 스튜디오 버전 정리 (VS/VC)  (0) 2021.05.28
문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

MFC Dialog 에서 enter, esc 동작을 제어하자

Programming/C, C++, MFC 2020. 11. 10. 09:57




MFC Dialog를 만들면 기본적으로 Enter 또는 ESC 키를 누르면 프로그램이 종료된다.

 

이는 Enter키 이벤트가 발생하면 자동으로 OnOK() 함수가 호출되고

ESC 키 이벤트가 발생하면 OnCancel() 함수가 호출되기 때문이다.

 

이러한 현상을 방지하기 위해서는 PreTranslateMessage 함수를 통해 제어가 가능하다.

 


// 클래스 마법사에서 PreTranslateMessage 가상함수를 추가.
BOOL CProjectDlg::PreTranslateMessage(MSG* pMsg)
{
    // TODO: 여기에 특수화된 코드를 추가 및/또는 기본 클래스를 호출합니다.
    if (pMsg->message == WM_KEYDOWN)
    {
        if (pMsg->wParam == VK_ESCAPE)
        {
        	// ESC 키 이벤트에 대한 처리 추가
            return TRUE;
        }
        else if (pMsg->wParam == VK_RETURN)
        {
        	// Enter 키 이벤트에 대한 처리 추가
             return TRUE;
         }
     }
    return CDialogEx::PreTranslateMessage(pMsg);
}
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

문자열 인코딩 변경하기  (0) 2021.05.06
특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

하위폴더 포함, 폴더 전체를 복사하자

Programming/C, C++, MFC 2020. 11. 10. 09:55




하위폴더 및 파일들을 포함한 폴더를 다른 경로로 전체 복사하고 싶은 경우가 있다.

 

이럴 경우 SHFileOperation 를 이용하여 복사를 수행하자.


int CopyFolder(CString szFrom, CString szTo)
{
	SHFILEOPSTRUCT shfo;
	int nRet;
	char* pszFrom = new char[szFrom.GetLength() + 1];
	char* pszTo = new char[szTo.GetLength() + 1];

	strcpy(pszFrom, szFrom);
	strcpy(pszTo, szTo);

	ZeroMemory(&shfo, sizeof(SHFILEOPSTRUCT));
	shfo.hwnd = AfxGetMainWnd()->m_hWnd;
	shfo.wFunc = FO_COPY;
	shfo.pFrom = pszFrom;
	shfo.pTo = pszTo;
	shfo.fFlags = FOF_NOCONFIRMATION | FOF_NOERRORUI | FOF_SILENT | FOF_NOCONFIRMMKDIR;
	shfo.lpszProgressTitle = NULL;

	nRet = SHFileOperation(&shfo);

	delete[] pszFrom;
	delete[] pszTo;

	return nRet;
}

 


이유는 아직 확인 못했지만 위 방법이 사용중 오류가 발생하는 경우가 있어서 아래 방법으로 대체하여 사용 중 (20.11.20. 기준)

int CopyFolder(CString szFrom, CString szTo)
{
	HANDLE hSrch;
	WIN32_FIND_DATA wfd;
	BOOL bResult = TRUE;
	TCHAR WildCard[MAX_PATH];
	TCHAR SrcFile[MAX_PATH];
	TCHAR DestFile[MAX_PATH];

	wsprintf(WildCard, "%s\\*.*", szFrom);
	CreateDirectory(szTo, NULL);
	hSrch = FindFirstFile(WildCard, &wfd);
	if (hSrch == INVALID_HANDLE_VALUE)
		return FALSE;
	while (bResult) {
		wsprintf(SrcFile, "%s\\%s", szFrom, wfd.cFileName);
		wsprintf(DestFile, "%s\\%s", szTo, wfd.cFileName);
		// 서브 디렉토리가 발견되면 서브 디렉토리를 복사한다.
		if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
			if (lstrcmp(wfd.cFileName, ".") && lstrcmp(wfd.cFileName, "..")) {
				CopyFolder(SrcFile, DestFile);
			}
		}
		else {
			CopyFile(SrcFile, DestFile, FALSE);
		}
		bResult = FindNextFile(hSrch, &wfd);
	}
	FindClose(hSrch);
	return TRUE;
}
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

특정주소가 폴더(디렉토리)인지 파일인지 확인하자  (0) 2021.02.04
MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

std::string에서 format을 사용하자

Programming/C, C++, MFC 2020. 3. 19. 11:31




std::string을 사용하다보면 sprintf나 CString 등과 같이 format 기능을 이용하여 문자열을 만들고싶을떄가 있다.

 

이런 상황을 위한 방법을 정리.

 

아래와 같이 정의된 string_format 함수를 이용하여 format 과 동일하게 사용 가능하다. 

 


template<typename ... Args>
std::string string_format(const std::string& format, Args ... args)
{
	size_t size = snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
	if (size <= 0) { throw std::runtime_error("Error during formatting."); }
	std::unique_ptr<char[]> buf(new char[size]);
	snprintf(buf.get(), size, format.c_str(), args ...);
	return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}


// 사용법
std::string sResult = "";
std::string stringValue = "string...";
int intValue = 999;
sResult = string_format("string format example : %s / %d", stringValue, intValue);
저작자표시

'Programming > C, C++, MFC' 카테고리의 다른 글

MFC Dialog 에서 enter, esc 동작을 제어하자  (0) 2020.11.10
하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 2개가 달렸습니다

댓글을 달아 주세요

  • 정청 2021.06.08 16:05  댓글주소  수정/삭제  댓글쓰기

    옵뽜.. 멋져용
    드루와!! 드루와!!

  • f@k.u 2021.08.16 09:39  댓글주소  수정/삭제  댓글쓰기

    스택오버플로 그대로 복붙해서 올리니까 좋노? 어이가 없네 ㅋㅋㅋㅋ

CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우

Programming/C, C++, MFC 2019. 7. 9. 17:12




CStdioFile을 이용하여 파일 입출력을 하는 경우 중 한글이 깨지는 경우가 발생.

일반적으로는 아래의 방법을 이용하여 해결 되는 경우가 많다.

 Unicode 환경에서 한글이 깨질경우 해결방법

 

Unicode 환경에서 한글이 깨질경우 해결방법

unicode 환경에서 LPCWSTR 로 문자열을 받았으나 한글이 꺠질 때 해결방법. 1. locale 헤더 파일 include 하기 #include "locale.h" 2. 코드에서 setlocale 선언해주기 setlocale(LC_ALL, ""); 위 두줄이면 문제..

jangjy.tistory.com

하지만 프로그램을 통하지 않고 외부에서 파일을 생성하고 읽으려니 글자가 깨지는 현상을 발견.

나의 경우는 notepad++ 에서 작성한 내용을 CStdioFile을 이용해서 읽으니 정상적으로 읽어지지 않는 케이스.

 

한참의 삽질 끝에 알아낸 것은 CStdioFile의 경우 내용을 저장 할 때 Unicode 나 UTF-8 로 저장하지 않고 ANSI로 저장한다는 점. 내용이 한글이더라도 ANSI로 저장하고 읽어오는 과정에서 이에대한 처리가 이루어진다고 한다.

그래서 notepad++ 에서 작성한 내용은 기본이 UTF-8로 저장되어 있어서 CStdioFile을 이용하여 readstring 한 경우
내용이 제대로 읽어지지 않은 것이었다.

 

이러한 문제를 해결하기 위해서는 외부에서 작성 된 내용을 ANSI로 인코딩 해 주거나 애초에 파일 내용을 CStdioFile을 이용하여 작성하면 된다.

 

'Programming > C, C++, MFC' 카테고리의 다른 글

하위폴더 포함, 폴더 전체를 복사하자  (0) 2020.11.10
std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

Tag ANSI, CStdioFile, MFC, ReadString, Unicode, UTF-8, 한글, 한글깨짐
트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

Unicode 환경에서 한글이 깨질경우 해결방법

Programming/C, C++, MFC 2019. 3. 11. 10:32




unicode 환경에서 LPCWSTR 로 문자열을 받았으나 한글이 꺠질 때 해결방법.


1. locale 헤더 파일 include 하기

    #include "locale.h"

2. 코드에서 setlocale 선언해주기

    setlocale(LC_ALL, "");


위 두줄이면 문제 해결.

저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

std::string에서 format을 사용하자  (2) 2020.03.19
CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (0) 2017.11.21
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

cout을 이용할때 출력 정밀도를 제어해 보자

Programming/C, C++, MFC 2018. 7. 26. 10:21




c 에서 출력할 경우 printf 함수를 통해 부동소수점 출력 정밀도를 정의 가능하다.


이와 동일한 기능을 cout을 이용 할 경우 필요한 함수에 대해 정리.



우선 관련 함수를 사용하기 위해서 iomanip 헤더를 include.


std::setprecision() : c++ 에서 출력 자리수 제한을 위해 사용

단 이 함수의 경우 소수점 아래 출력 정밀도 제어가 아닌 전체 출력 자리수를 제한한다.

이 함수를 사용하기전에 기본정밀도를 저장 해 두고 사용 후에는 원복 해 주자.



std::fixed : 소수점 이하 자리수를 제한하기 위해 setprecision과 함께 사용된다.



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iomanip>
 
float f = 103.141592653;
 
std::streamsize prec = std::cout.precision();
// 기본 정밀도 저장
 
std::cout << std::setprecision(4) << f << "\n";
// 출력값은 103.1
 
std::cout << std::fixed << std::setprecision(4) << f << "\n";
// 출력값은 103.1416
// setprecision 처리할때 출력 자리 이하에서 반올림 처리
 
std::cout << std::setprecision(prec) << f << "\n\n";
// 출력값은 103.141593
Colored by Color Scripter
cs


저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

CStdioFile 을 이용한 파일 입출력에서 내용이 깨질경우  (0) 2019.07.09
Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (0) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

메모리 동적할당 예시

Programming/C, C++, MFC 2018. 4. 18. 12:55




자주 쓰진 않지만 가끔 사용하는 동적할당 방법에 관한 예시


할당 한 메모리 해제는 필수.



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
// int A[100][200][300] 을 동적 할당.
 
int x;
int y;
int ***A;
 
A = new int ** [100];
for(x = 0; x < 100; x++)
{
        A[x] = new int * [200];
        for(y = 0; y < 200; y++)
        {
                A[x][y] = new int [300];
        }
}
 
// 메모리 해제
 
for(x = 0; x < 100; x++)
{
        for(y = 0; y < 200; y++)
        {
                delete [] A[x][y];
        }
}
 
for(x = 0; x < 100; x++)
{
        delete [] A[x];
}
delete [] A;
cs

저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

Unicode 환경에서 한글이 깨질경우 해결방법  (0) 2019.03.11
cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (0) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

cin 의 버퍼를 지워보자

Programming/C, C++, MFC 2017. 11. 21. 11:17




cin으로 입력을 받던 도중 잘못된 입력이 들어올 경우 문제가 되는 경우가 있다.

이때 한번만 입력을 잘못 받고 끝나면 다행이지만 cin의 버퍼에 잘못 입력된 값이 남아있어서

이후 입력까지 계속 문제가 되곤 한다.


이럴 경우에는 cin의 버퍼를 지워주는 작업이 필요하다.


예를들어 nNumber 라는 int 형 변수에 숫자를 입력 받고자 하는데 문자가 입력되어 자료형이 맞지 않을경우

에러가 발생한다


  1. int nNumber = -1;
  2. while (true)
  3. {
  4.     cin >> nNumber;
  5.     if (cin.fail())
  6.     {
  7.         cout << "error" << endl;
  8.     }
  9. }


이와 같은 경우 nNumber에 정수형 값이 아닌 다른 값이 들어 올 경우 에러가 발생하고 cin의 에러비트가 활성화 되어

경고 메세지를 출력한다. 

하지만 cin의 버퍼에는 여전히 다른 값이 남아있기 때문에 while 문에 의하여 경고메세지를 반복해서 출력한다.


이럴 경우 에러비트를 초기화 해주는 clear() 함수와 버퍼값을 비워주는 ignore() 함수를 사용하면 된다.

clear()는 파라미터 없이 에러비트를 초기화 해 주는 역할을 하며

ignore는 첫번째 파라미터가 입력받을 문자열 길이, 두번째 파라미터가 종료문자이다.

첫번째 파라미터로 입력받은 길이만큼 혹은 두번째 파라미터로 입력받은 종료문자가 들어오면 읽기를 중단하는 역할을 한다.

문자열의 길이는 적당히 충분한 값을 주면 되고, 종료문자로는 일반적으로 개행문자 (\n)을 사용하면 된다.

즉 엔터를 통해 입력이 종료되면 그 시점까지만 입력을 받겠다는 의미가 된다.


두 함수를 추가하여 아래와 같이 사용을 하면 에러 비트초기화와 버퍼 초기화를 통해 

반복적인 에러 메세지 출력을 막을 수 있다.


  1. int nNumber = -1;
  2. while (true)
  3. {
  4.     cin >> nNumber;
  5.     if (cin.fail())
  6.     {
  7.         cout << "error" << endl;
  8.         cin.clear();
  9.         cin.ignore(INT_MAX, '\n');
  10.     }
  11. }



저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

cout을 이용할때 출력 정밀도를 제어해 보자  (0) 2018.07.26
메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (0) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법

Programming/C, C++, MFC 2017. 10. 16. 16:04




잘 쓰던 Visual Studio 프로젝트가 어느날 갑자기 제약조건과 일치하는 올바른 내보내기를 찾을수 없다며

열리지 않는 경우가 발생


뭔가 꼬인건가 싶어서 비주얼스튜디오를 새로 설치하려다 검색부터..


딱 해결 방법이 나오길래 다음번에 이런 상황이 발생 할 때를 대비하여 여기에도 기록.



 제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다.

               ContractName 
Microsoft.VisualStudio.Text.ITextDocumentFactoryService 
               RequiredTypeIdentity

Microsoft.VisualStudio.Text.ITextDocumentFactoryService



이러한 에러가 발생 할 경우

C:\Users\컴퓨터이름\AppData\Local\Microsoft\VisualStudio\[본인VS버전]

경로로 이동 후 ComponentModelCache 폴더를 삭제 후 재실행 하면 정상 동작한다.



도움받은 블로그 : http://doriyun.tistory.com/7

저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

메모리 동적할당 예시  (0) 2018.04.18
cin 의 버퍼를 지워보자  (0) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

프로그램 배포시 아이콘과 MFC dll 관련 설정

Programming/C, C++, MFC 2017. 6. 8. 15:55




MFC 기반의 프로그램을 배포하다 보면 심심치않게 dll 이 없어서 문제가 되는 경우가 있다.


일반적으로는 MS 재배포패키지를 설치하면 이런 문제는 해결 되지만 이는 사용자가 다시 한번 작업을 해야하는

번거로움이 있고 일부 환경에서는 설치가 불가능한 경우도 있다.


이럴 경우를 대비하여 MFC 관련 dll을 정적으로 사용하는 방법 정리.


프로젝트속성 - 구성속성 -일반 - MFC사용 의 값을 Static Library로 변경


MFC 관련 dll이 정적으로 포함되면서 실행파일의 크기는 조금 더 커지지만

dll 관련하여 실행상 문제는 해결 되니 이 방법을 사용하도록 하자.



또 아이콘을 설정 할 경우 이전에는 ico 파일을 프로젝트에서 리소스로 불러다 연결했었는데

이 경우 다른 환경으로 프로젝트 채로 복사하는 경우 ico 파일이 없어서 문제가 발생하곤 한다.

프로젝트 폴더 - res - XX.ico 파일을 사용하고자 하는 파일로 변경하면 프로젝트 복사할 때 ico 파일 빼먹어서

문제가 되는 경우를 예방할 수 있다.


저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

cin 의 버퍼를 지워보자  (0) 2017.11.21
'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )

Programming/C, C++, MFC 2016. 5. 17. 20:05




dll을 만들어야 할 상황에서 일반적으로는 함수를 만드는 경우가 대부분이지만 


클래스 자체를 포함하는 dll을 만들어야 할 경우가 있다.


이런 경우 클래스를 포함하는 dll을 만드는 방법에 대한 정리.



필요로 하는 클래스가 선언 및 정의 된 Class.cpp 와 Class.h 가 있고

이녀석을 감싸기 위한 ClassDLL.cpp 와 ClassDLL.h 를 준비하자.


< Class.h >

  1. #pragma once
  2.  
  3. class Source
  4. {
  5. public:
  6. int add(int a, int b);
  7. int mul(int a, int b);
  8. };


< Class.cpp >

  1. #include "Class.h"
  2.  
  3. int Source::add(int a, int b)
  4. {
  5.   return a + b;
  6. }
  7.  
  8. int Source::mul(int a, int b)
  9. {
  10.   return a*b;
  11. }



이제 이녀석을 감싸기 위한 ClassDLL.cpp와 ClassDLL.h를 만들자.


< ClassDLL.h >

  1. #ifdef DLLEXPORT
  2. #define MYDLLTYPE __declspec(dllexport)
  3. #else
  4. #define MYDLLTYPE __declspec(dllimport)
  5. #endif
  6.  
  7. typedef void* pSource;
  8.  
  9. extern "C" MYDLLTYPE SourceConstruct();
  10. extern "C" MYDLLTYPE int SourceAdd(pSource money, int a, int b);
  11. extern "C" MYDLLTYPE int SourceMul(pSource money, int a, int b);
  12. extern "C" MYDLLTYPE void SourceDestruct(pSource money);


< ClassDLL.cpp >

  1. #define DLLEXPORT
  2. #include "ClassDLL.h"
  3.  
  4. extern "C" MYDLLTYPE pSource SourceConstruct()
  5. {
  6.   Source* source = new Source();
  7.   return (pSource)source;
  8. }
  9.  
  10. extern "C" MYDLLTYPE int SourceAdd(pSource source, int a, int b)
  11. {
  12.   Source* source = (Source*)source;
  13.   return source->add(a, b);
  14. }
  15.  
  16. extern "C" MYDLLTYPE int SourceMul(pSource source, int a, int b)
  17. {
  18.   Source* source = (Source*)source;
  19.   return source->mul(a, b);
  20. }
  21.  
  22. extern "C" MYDLLTYPE void SourceDestruct(pSource source)
  23. {
  24.   Source* source = (Source*)source;
  25.   delete source ;
  26. }



이렇게 만들어 주고 빌드하면 lib 와 dll 이 생성 되겠지..


이놈들을 사용할때는 아래와 같이 사용한다.

  1. #include <stdio.h>
  2. #include "ClassDLL.h"
  3.  
  4. #pragma comment(lib, "ClassDLL.lib")
  5.  
  6. void main()
  7. {
  8.   pSource source = SourceConstruct();
  9.  
  10.   const int a = 2, b = 3;
  11.   printf("%d + %d = %d\n", a, b, SourceAdd(source, a, b));
  12.   printf("%d * %d = %d\n", a, b, SourceMul(source, a, b));
  13.  
  14.   SourceDestruct(source);
  15. }



나중에 쓸 일이 있을 것 같아서 정리.




참고 : http://egloos.zum.com/tain68/v/10421967

저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

'제약 조건과 일치하는 올바른 내보내기를 찾을 수 없습니다' 해결방법  (0) 2017.10.16
프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
[Function] 폴더 내 파일 탐색  (0) 2015.12.09
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 1개가 달렸습니다

댓글을 달아 주세요

  • 오호라 2020.12.03 19:51  댓글주소  수정/삭제  댓글쓰기

    덕분에 해결했네요.
    약간의 편법을 사용하는군요...(클래스를 바로 export/import하진 않는군요)
    클래스 포인터만 가져와서 void*에 저장해놨다가 중간 매체는 *DLL.cpp 쪽에서 연결해주는 방식이군요..

    근데..
    < ClassDLL.cpp >에서 Source 클래스를 사용하는데 아마 인식을 못할 듯 합니다.
    #include "ClassDLL.h" 뿐 아니라
    #include "Class.h" 를 포함해줘야 하는게 맞는게 아닌지...

    두개 다 해주는게 맞겠죠? 맞나요?

visual studio 프로젝트 및 솔루션 이름을 변경하기.

Programming/C, C++, MFC 2016. 5. 17. 11:09




프로젝트명 수정이 필요한 경우가 종종 있는데 이 경우 사용 가능한 방법인듯..


================================================================================================


급하게 프로젝트를 만들다보니, 혹은 개발하다 보니, 프로젝트 명을 바꿔야 한다면??


*.sln 파일을 메모장에서 열어서 수정하자!


FirstTestName 이라는 프로젝트가 있으면


1. FirstTestName.sln 을 메모장에서 연다.

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "FirstTestName", "FirstTestName\FirstTestName.vcproj", "{01687A62-7B7A-4F47-B8FB-38B2A291BA7D}"

이렇게 바꾼다.

Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "NewName", "NewName\NewName.vcproj", "{01687A62-7B7A-4F47-B8FB-38B2A291BA7D}"


2. FirstTestName 이라는 모든 걸 NewName으로 바꾼다. 물로 폴더 명까지 바꾼다.


3. FirstTestName.vcproj 라는 파일 역시 메모장에서 열어본다.

<?xml version="1.0" encoding="ks_c_5601-1987"?>

<VisualStudioProject

ProjectType="Visual C++"

Version="9.00"

Name="FirstTestName"

ProjectGUID="{01687A62-7B7A-4F47-B8FB-38B2A291BA7D}"

RootNamespace="FirstTestName"

Keyword="MFCProj"


이렇게 바꾼다.


<?xml version="1.0" encoding="ks_c_5601-1987"?>

<VisualStudioProject

ProjectType="Visual C++"

Version="9.00"

Name="NewName"

ProjectGUID="{01687A62-7B7A-4F47-B8FB-38B2A291BA7D}"

RootNamespace="NewName"

Keyword="MFCProj"

이후 다시 컴파일.


출처 : 비주얼 스튜디오 프로젝트 솔루션 이름 바꾸기 (visual studio solution name change)


저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

프로그램 배포시 아이콘과 MFC dll 관련 설정  (0) 2017.06.08
class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
[Function] 폴더 내 파일 탐색  (0) 2015.12.09
성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점  (0) 2015.04.21
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.

Programming/C, C++, MFC 2016. 3. 9. 15:32




웹상을 파일을 프로그램을 통해 다운로드 하기 위한 함수.


여러 블로그에 글이 있지만 가장 쓰기 간단하게 잘 정리되있는 글 담아두기..


원문 중

=================================================================================================

getFileFromHttp("http://tattertools.com/ko/tistoryBanner01.gif", "tistoryBanner01.gif");

이미지 파일을 다운 받으려면 어떻게 해야되는지 몰라서 한참 해맸다.
URL에는 파일명까지 들어가야된다. 그리고 저장할 파일의 이름을 지정한다.
특정 폴더에 파일을 저장하려면 저장할 파일에 패스를 입력하면된다.
예를 들어 URL을 이렇게 주고 "http://wwwi.tistory.com/"
저장할 파일을 "test.html"로 주면 http://wwwi.tistory.com/의 첫페이지가  test.html로 저장된다.


  1. #include "Wininet.h"      //  밑의 함수를 쓰려면 이 라인을 반드시 추가해야 됨
  2. #define READ_BUF_SIZE    1024
  3.  
  4. // 웹상의 파일을 다운로드
  5. int getFileFromHttp(char* pszUrl, char* pszFile)
  6. {
  7.     HINTERNET    hInet, hUrl;
  8.     DWORD        dwReadSize = 0;
  9.  
  10.     // WinINet함수 초기화
  11.     if ((hInet = InternetOpen("MyWeb",            // user agent in the HTTP protocol
  12.                     INTERNET_OPEN_TYPE_DIRECT,    // AccessType
  13.                     NULL,                        // ProxyName
  14.                     NULL,                        // ProxyBypass
  15.                     0)) != NULL)                // Options
  16.     {
  17.         // 입력된 HTTP주소를 열기
  18.         if ((hUrl = InternetOpenUrl(hInet,        // 인터넷 세션의 핸들
  19.                     pszUrl,                        // URL
  20.                     NULL,                        // HTTP server에 보내는 해더
  21.                     0,                            // 해더 사이즈
  22.                     0,                            // Flag
  23.                     0)) != NULL)                // Context
  24.         {
  25.             FILE    *fp;
  26.  
  27.             // 다운로드할 파일 만들기
  28.             if ((fp = fopen(pszFile, "wb")) != NULL)
  29.             {
  30.                 TCHAR    szBuff[READ_BUF_SIZE];
  31.                 DWORD    dwSize;
  32.                 DWORD    dwDebug = 10;
  33.  
  34.                 do {
  35.                     // 웹상의 파일 읽기
  36.                     InternetReadFile(hUrl, szBuff, READ_BUF_SIZE, &dwSize);
  37.  
  38.                     // 웹상의 파일을 만들어진 파일에 써넣기
  39.                     fwrite(szBuff, dwSize, 1, fp);
  40.  
  41.                     dwReadSize += dwSize;
  42.                 } while ((dwSize != 0) || (--dwDebug != 0));
  43.  
  44.                 fclose( fp );
  45.             }
  46.             // 인터넷 핸들 닫기
  47.             InternetCloseHandle(hUrl);
  48.         }
  49.         // 인터넷 핸들 닫기
  50.         InternetCloseHandle(hInet);
  51.     }
  52.     return(dwReadSize);
  53. }


출처 : http://wwwi.tistory.com/35


저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

class를 포함한 dll 만들기 ( 클래스 동적 라이브러리 )  (1) 2016.05.17
visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
[Function] 폴더 내 파일 탐색  (0) 2015.12.09
성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점  (0) 2015.04.21
[VS2013] error MSB8031 - 멀티바이트문자집합 에러를 해결하자.  (0) 2015.03.06
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 3개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

[Function] 폴더 내 파일 탐색

Programming/C, C++, MFC 2015. 12. 9. 09:41




프로젝트를 진행하다 보니 MFC가 편할때도 있지만 불편한 경우도 많은 것 같다.


MFC 위주로 코딩햇지만 이제는 MFC를 자제하려고 노력중.


폴더 내 파일 탐색을 할 경우 MFC 에서는 CFileFinder 가 있어서 편했지만 


c++에서 이녀석을 대체할 _finddata_t 를 이용해서 파일을 탐색 해보자.


  1. #include <io.h>
  2.  
  3. _finddata_t filefinder;
  4. long handle;
  5. int nExistNext = 1;
  6.  
  7. handle = _findfirst(".\\*.*", &filefinder);
  8.  
  9. if (handle == -1)
  10. {
  11.         printf("There was no file.\n");
  12.         return;
  13. }
  14.  
  15. while (nExistNext != -1)
  16. {
  17.         printf("FileName : %s\n", filefinder.name);
  18.         nExistNext = _findnext(handle, &filefinder);
  19. }
  20.  
  21. _findclose(handle);
  22. return;


저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

visual studio 프로젝트 및 솔루션 이름을 변경하기.  (0) 2016.05.17
HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
[Function] 폴더 내 파일 탐색  (0) 2015.12.09
성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점  (0) 2015.04.21
[VS2013] error MSB8031 - 멀티바이트문자집합 에러를 해결하자.  (0) 2015.03.06
Dialog에 Drag&Drop 기능을 적용하자.  (0) 2014.12.01
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점

Programming/C, C++, MFC 2015. 4. 21. 13:56





if 와 switch 비슷하지만 다른녀석 


이 아이들의 특징을 잘 정리해 주신 분이 있어 메모.


==========================================================================================


if~else 문과 switch~case 문의 차이점에 관해서 알아보자...

코드는 다음과 같이 작성 해 보았다.






이 예제를 보면 분석하기 쉬울 것이다.

if문 예제에 대한 assembly 코드는 다음과 같다.





위 assembly 코드를 보면 1,2,3,4를 보면 각 조건문마다 cmp 명령문을 사용한 것을 볼 수 있다.

따라서, 최악의 경우에 조건문의 개수만큼 cmp를 하게 된다.O(n)의 시간복잡도를 갖는다고 말할 수 있겠다.



switch 문에 대한 assembly코드이다.


이 코드에 관해 약간의 설명을 하겠다.


1 : ecx 레지스터으 ㅣ값을 1 감소한다. 이는 switch 문에서 대상이 되는 값을 1 감소하는 것이다.

이때, 항상 1을 감소하는 것이 아니라 case 문 중에서 가장 작은 값을 ecx레지스터에서 뺴는 것이다.

이렇게 하면 switch문에서 ecx레지스터으 ㅣ값은 (case문의 개수 - 1)이 된다.

이게 바로 switch문에서 쓰이는 jump table의 크기가 되는 것이다.

-1을 하는 이유는 배열의 시작 번지가 0이기 때문이다. 

3번에서 jmp명령어를 보면 배열을 이용하여 jump table에 접근하는 것을 볼 수 있다.


2 : switch 문에 있는 변수값 (a)가 3보다 큰지를 검사하고 있다.

만일에 크다면 jump할 case문이 없으므로 default 문으로 이동하도록 하는 코드이다.

이때 3과 비교하는 것은 case문에서 (가장 큰 값 -1) 이 3이기 때문이다.

만이레 3보다 크다면 jump 할 case문이 없기 때문이다.


3 : jump 할 case 문이 있을 경우 이 코드에 진입을 한다.

이 코드에 진입 한 후 jump table을 뒤져보는 것이다. 

jump table에 mapping 되는 값으로 jump 하도록 되어있다.


4 : 이곳이 바로 jump table 이다. 

이 jump table의 크기는 (case문의 가장큰값 - case문의 가장작은값 + 1)이다.

이 jump table의 각 원소의 값은 jump 할 label 이다.


그렇다면 정말로 jump table의 크기가 (case문의 가장큰값 - case문의 가장작은값 + 1)일까 ??


그렇다면 case 1, case 2, case 3, case 10이라면 jump table의 크기가 어떻게 될까 ???


최적화의 관점에서 보자면, 테이블의 크기가 4ㅇ리면 좋겠지만, 애석하게도 성능의 향상을 위해서 테이블의 크기를 10으로 했다.


다음 C 코드를 보자



If 문의 assembly 코드는 다음과 같다. 특별한 점은 없다. 앞에서 설명한 것과 동일하다.





하지만, switch 문에서 jump table을 보면 다음과 같다.



$541에는 jump table의 index 번호가 저장되어 있고, 실제로 jump table은 $542에 저장되어 있음을 알 수 있다.


만약에 case 1, case 2, case 3, case 100000 이라면 메모리는 상당히 많이 차지 할 것이다.


성능을 향상 시키느냐 메모리를 향상 시키느냐는 결국 선택해야 할 문제이다.


만약에 if~else문이 매우 많이 있고, 그 함수를 매우 많이 호출하는데, 성능이 중요하다면 


switch case 문으로 성능 향상을 할 수 있을 것이다.


또한, switch case 문에서 case의 값은 가급적이면 순차적으로 감소 또는 증가하는 것이 메모리 관리면에서 좋을 것이다.


마지막으로 case문의 개수에 따라 switch 문은 jump tableㅇ르 사용 할 것인지 사용하지 않을 것인지를 결정한다.


이 case 문의 개수가 4이상이냐 아니냐는 것이다.


만약에 case 문의 개수가 4 이상이면 jump table을 사용하고, 그렇지 않다면 사용하지 않는다. 


출처 : http://blog.naver.com/PostView.nhn?blogId=kki2406&logNo=80041410085




저작자표시비영리

'Programming > C, C++, MFC' 카테고리의 다른 글

HTTP 프로토콜을 이용하여 웹상의 파일을 다운로드 하자.  (0) 2016.03.09
[Function] 폴더 내 파일 탐색  (0) 2015.12.09
성능 및 메모리 관점에서 살펴본 if문과 switch 문의 차이점  (0) 2015.04.21
[VS2013] error MSB8031 - 멀티바이트문자집합 에러를 해결하자.  (0) 2015.03.06
Dialog에 Drag&Drop 기능을 적용하자.  (0) 2014.12.01
rand() 는 랜덤이 아니다?? 이제는 랜덤을 바꿔야 할 때!  (0) 2014.11.21
블로그 이미지

매직블럭

작은 지식들 그리고 기억 한조각

트랙백 0개, 댓글 0개가 달렸습니다

댓글을 달아 주세요

  • «
  • 1
  • 2
  • 3
  • »

카테고리

  • 살다보니.. (414)
    • 주절거림 (3)
    • 취미생활 (36)
      • 지식과 지혜 (3)
      • 풍경이 되어 (4)
      • Memories (17)
      • 엥겔지수를 높여라 (2)
    • mathematics (6)
      • Matrix Computation (2)
      • RandomProcesses (3)
    • English.. (8)
    • Programming (134)
      • C, C++, MFC (51)
      • C# (1)
      • OpenCV (17)
      • Python (47)
      • Git, Docker (3)
      • Matlab (4)
      • Windows (3)
      • Kinect V2 (2)
      • 기타 etc. (6)
    • 전공관련 (73)
      • Algorithm (6)
      • Deep Learning (49)
      • 실습 프로그램 (4)
      • 주워들은 용어정리 (8)
      • 기타 etc. (6)
    • Computer (104)
      • Utility (21)
      • Windows (24)
      • Ubuntu, Linux (55)
      • NAS (2)
      • Embedded, Mobile (2)
    • IT, Device (41)
      • 제품 사용기, 개봉기 (14)
      • 스마트 체험단 신청 (27)
    • Wish List (3)
    • TISTORY TIP (5)
    • 미분류. 수정중 (1)

태그목록

  • ColorMeRad
  • DeepLearning
  • 크롬
  • portugal
  • 오봉자싸롱
  • Deep Learning
  • 후쿠오카
  • 매트랩 함수
  • 포르투갈
  • 스마트체험단
  • 큐슈
  • 일본
  • 칼로리 대폭발
  • Computer Tip
  • matlab
  • function
  • CStdioFile
  • 딥러닝
  • random variable
  • Convolutional Neural Networks
  • 매트랩
  • ReadString
  • 갤럭시노트3
  • matlab function
  • review
  • DSLR
  • LIBSVM
  • utility
  • SVM
  • 에누리닷컴

달력

«   2022/05   »
일 월 화 수 목 금 토
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        
05-20 05:33

LATEST FROM OUR BLOG

  • 골뱅이 연산자의 의미 (행렬곱)..
  • 프린터 용지 부족 문제를 해⋯.
  • [MXNet] 데이터 리스트를 만⋯.
  • 예쁘게 출력하자 pprint - pr⋯.
  • 작업표시줄 미리보기를 리스⋯.
  • 이미지 실제 파일 포맷 확인하기.
  • 알리 등 해외배송 배송상태를⋯.
  • 티스토리 코드블럭 내용을 복⋯.
  • warning 을 on/off 하자.
  • windows 10 파일 선택, 파일⋯.
RSS 구독하기

BLOG VISITORS

  • Total : 1,114,475
  • Today : 37
  • Yesterday : 672

Copyright © 2015 Socialdev. All Rights Reserved.

티스토리툴바