프로그래밍을 하다 보면 입력 변위값에 대한 판정을 내리거나 입력받은 값의 유효성을 검사해야 될때가 많다.


예를 들어 1~100 까지의 정수만 허용이 되는데 110이 들어올때다..


물론 if문을 통해서 처리하는 방법이 가장 많이 쓰인다.


하지만 조건도 길어지고, 반복작업의 경우 지겹다;


그래서 템플릿 함수로 작성을 해봤다.


전역함수로 선언해놓고 여기저기서 끌어다 쓰면 편할듯 하다.


코드는 아래와 같다.


아.. 템플릿함수 정의는 헤더파일에서 해야한다. ( 관련글 : 

2018/07/09 - [Programming] - [C++]template 함수 사용간 error LNK2019 에러 발생 조치 방법)





template< typename type > extern bool IsInRange(type _min, type _max, type _val){ return ((_min <= _val) && (_val <= _max)); }


피라메터는 3개다. 하한값, 상한값, 체크할 값



template을 사용하여 피라메터로 들어온 값을 계산하고 피라메터로 받은 range에 따라 true/false 반환하는 함수를 만들었는데


LINK2019 에러가 자꾸 발생한다.


구글링해보니 선언만 있고 정의가 없을때 발생한다는데 .h와 .cpp에 선언과 정의 잘 되어 있는데 자꾸 에러가 나서 삽질만 반나절 했다.


점심 먹고 들어와서 다시 템플릿은 클래스가 아니다 말그대로 '틀'일 뿐이다, 라는 설명과 함께 한곳에서 선언과 정의가 이뤄저야 한다는 것이다.


이것이 뭔말이냐 하면 그냥 헤더파일에 선언과 함께 동시에 정의까지 해버리라는거다.


선언부 ( test.h)

 template< typename type > extern bool IsInRange(type _min, type _max, type _val);

정의부 (testcpp)

template< typename type > bool IsInRange(type _min, type _max, type _val)
{
	return ((_min <= _val) && (_val <= _max)); 
}

위와 같이하면 LINK2019 에러 발생한다.


따라서 아래와 같이 헤더파일에 선언 정의 동시에 해줘야 한다.


template< typename type > extern bool IsInRange(type _min, type _max, type _val){ return ((_min <= _val) && (_val <= _max)); }


물론 선언과 정의를 따로 하는 방법도 있을것이다. 


헤더에 정의를 해도 무방할정도의 짧은 코드이기 때문에 이 방법을 사용한것이다.







isalpha()

 함수형태 

 isalpha(int c)

 파라미터

 c − 확인할 문자(ASCII)

 리턴

 0 != c가 알파벳, 0 = c는 알파벳이 아님




isdigit()

 함수형태 

 isdigit(int c)

 파라미터

 c − 확인할 문자(ASCII)

 리턴

 0 != c가 숫자, 0 = c는 숫자가 아님




	CString strTest = _T("ABCDEFG01234");
	if (isalpha(strTest[2]))
	{
		// true
		// ...
	}
	else
	{
		// false
		// ...
	}
	if (isdigit(strTest[7]))
	{
		// true
		// ...
	}
	else
	{
		// false
		// ...
	}


VisualStudio가 설치된 환경에서 프로그램 실행 후 발생된 문제를 디버깅할 때 덤프파일을 이용한 방법이 사용된다.


물론, 브레이크포인트 걸어서 추적하는 방법이 가장(?) 빠를테지만, 디버깅 상태로 실행된 경우가 아닌경우에는 덤프파일로 확인하는 방법을 사용한다.


일단 프로그램에서 크래쉬가 나거나, Leak등이 발생해서 프로그램이 종류될때, 덤프파일(*.dmp)이 생성되도록 코드를 추가해야한다. 


이부분은 구글링으로 손쉽게 찾을 수 있다. (키워드 : miniDump)



pdb파일은 프로젝트 설정에서 생성하도록 설정 할 수 있다.



프로젝트 속성- 링커 - 디버깅 탭에서 '디버그 정보 생성' , '프로그램 데이터베이스 파일 생성' 부분만 변경하면 된다.



코드를 짜다 보면 빈줄을 정리하고자 할때가 자주 있다.


여려명이 작업한 코드를 Merge한다거나, 외부 소스를 사용한 경우, 테스트를 마치고 최적화 단계, 그냥 빈줄이 너무 많아 보기 싫어서..


한두줄이면 그냥 지우는데 10줄이 넘어가면 슬슬 지루하고 짜증이 나기 마련..


찾아보니 간단한 정규식으로 빈줄만 삭제가 가능하다.



VisualStduio에서 찾기 및 바꾸기 (단축기 Ctrl + Shift + F)

^(?([^\r\n])\s)*\r?$\r?\n


찾을 내용에 위 문자열을 넣고 바꿀내용은 비워둔 상태에서 정규식 사용에 체크하고 사용하면 된다.


찾는 위치를 선택영역 또는 현재문서로 한정해서 사용해야한다. 


보통 이 항목이 전체 솔루션으로 되있는데 이상태에서 모두 바꾸기를 해버리면 리소스 파일까지 바꿔버리니, 꼭 선택영역이나 현재문서로 한정해서 사용하자.


선택영역은 말그대로 빈줄을 삭제할 영역을 블록 씌운 상태에서 해당 선택 내용안에서만 찾겠다는 거다.


VisualStudio 2013에서 잘 작동한다.


출처 : http://kjcoder.tistory.com/632 


알파벳 대소문자, 숫자를 포함한 랜덤한 문자열을 생성하는 함수



출처는 StackOverflow

void gen_random(char *s, const int len)
{
	static const char alphanum[] =
		"0123456789"
		"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
		"abcdefghijklmnopqrstuvwxyz";

	for (int i = 0; i < len; ++i) {
		s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
	}

	s[len] = 0;
}

여기에 문자 중복이 안되게끔 하거나, 특수문자를 추가하는 방법도 고려해봐야겠다.


+ Recent posts