SendMessage 와 PostMessage 의는 차이점이 있습니다.
둘다 해당 윈도우로 메시지를 보내는 기능을 가지지만 내부 동작이 다릅니다.
PostMessage의 경우 해당 윈도우 메시지 큐에 메시지를 붙이고 바로 리턴을 하므로 동작이 비동기 적 입니다.
즉 PostMessage를 호출한다 하여도 해당 윈도우가 다른 메시지를 처리하느라 바쁘다면 약간 처리가 늦어 지게 됩니다.
따라서 미쳐 문자열 포인터에 접근하기전에 이쪽에서 먼저 메모리를 해제해 버리면 문자열이 날아가 버리겠죠..
반면 SendMessage는 큐에 붙이는것이 아니라 메시지 프로시져를 직접 실행
하게 됩니다. 즉 동기적 이죠 SendMessage를 호출하는순간 바로 해당 윈도우의 프로시져를 직접 실행하게 되므로 SendMessage를 호출한 순간에 바로 실행이 되고 리턴이 되어야 현재 호출한 곳으로 제어가 돌아옵니다.
따라서 스택에 할당된 문자열을 포인터로 넘겨도 메모리는 해제가 되지 않습니다.
SendMessage를 호출하는 동안은 제어가 돌아오지 않으므로 당연히 해제도되지 않게 되지요.
굳이 불안하시다면 WS_COPYDATA 메시지에 실어서 보내는 방법도 있으니 찾아 보시면 알수 있을듯 합니다.
<출처: 네이버 지식IN>
글 검색 결과
- 2009/04/28 [WINAPI] SendMessage (동기) 와 PostMessage (비동기)의 차이점
- 2009/04/28 [C++] static storage class 란?
- 2009/04/28 [URL] CVS 서버 제공: www.cvsdude.com (2MB 무료)
- 2009/04/28 Visual Assist 간단소개 및 단축키
- 2009/04/28 병렬처리 방법 #2. 컴파일러가 지원하는 OpenMP !
- 2009/04/28 #define을 이용한 typedef 중복 선언 방지법
- 2009/04/28 [ERROR] 힙이 손상되었거나 Sample1.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.
- 2009/04/28 [STL] 요약 : container, iterator, algorithm, 함수자(functor), adaptor, allocator
- 2009/04/28 [Visual C++/MSDN] 도움말 항목에서 코드 예제 컴파일 방법
- 2009/04/28 [SVN] Trac 설치하기 (링크)
- 2009/04/28 [설계] 스토리 보드란?
- 2009/04/28 [CVS] TortoiseCVS : Icon Overlays, UPDATE 이니셜 의미
- 2009/04/28 [CVS] CvsNT on WinXP
- 2009/04/28 [JSP] Tomcat: 한글 문제
- 2009/04/28 [JSP] str->int,int->str
[WINAPI] SendMessage (동기) 와 PostMessage (비동기)의 차이점
PostMessage,
SendMessage,
winapi
- 이 글의 트랙백 주소
- 이 글에는 트랙백을 보낼 수 없습니다
- 댓글 남기기
[C++] static storage class 란?
어떤 대상이 static으로 선언되어 있다면 이것이 의미하는 바는, 이 대상이 메모리상의 어떤 위치에 바인딩되는지 '컴파일타임'에 '정적으로' 바인딩되어 고정된다는 의미입니다. (혹은 링크타임에 되기도 합니다만, 여기서의 논의에서는 섞어서 사용하기로 하죠) -static이란 메모리를 고정시킨다는 의미의 예약어입니다. 이건 변수나 객체에 해당되는 얘기고 함수에 static이면 static인 변수나 객체만 접근을 한다는 얘기구요-
그래서, static으로 선언된 대상이 무엇이든 그것이 메모리의 어느 부분에 대응되는지는 컴파일타임에 결정되어 고졍될 수 있어야 합니다.
1) local static 변수 : 일반적으로 로컬변수는 스택 영역에 생성되며, 해당 함수가 호출되는 시점에 따라 로컬 변수가 바인딩되는 주소가 달라지게 됩니다. 이는 static의 정의에 위배되는 일이죠. 따라서 로컬변수를 static으로 선언하면 컴파일 과정에서 전역 데이터 영역에 변수를 생성하고 그 위치에 변수의 주소를 바인딩합니다. 전역데이터영역은 프로그램 수행동안 침범되지 않는 영역이므로 안전하게 정적으로 바인딩된 주소를 유지할 수 있습니다.
2) global static 변수 : local변수는 static으로 선언될 때 전역 데이터 영역에 생성된다고 했습니다. 전역 데이터 영역은 다른 곳이 아니라, 바로 전역변수가 자리잡는 영역이죠. 그런데 전역변수를 static으로 선언했을경우, 전역변수는 이미 전역 데이터 영역에 자리잡는 변수이므로 위치는 그전과 같습니다. 하지만 전역static변수가 그냥 전역 변수와 다른 점은 반드시 '컴파일타임'에 바인딩될 수 있어야 한다는 것입니다.
전역변수의 경우, extern키워드로 다른 모듈의 전역변수를 링크해서 사용할 수 있습니다. 여기서 중요한 것은 extern키워드로 선언한 전역변수는 링크 타임에 메모리의 위치가 바인딩되어 결정된다는 것이지요. static 개체는 위에서 말했듯이, '컴파일타임'에 메모리 바인딩이 결정되어야 합니다.
따라서 static으로 선언한 전역변수는 다른 모듈에서 extern으로 링크해서 사용할 수 없습니다.
3) static member 변수 : 클래스의 일반적인 멤버변수는 this포인터를 기반으로 오프셋이 얼마.. 라는 식으로 멤버변수의 주소를 계산하게 됩니다. 즉, 이 말은 어떤 변수를 참조할때, 메모리상의 어떤 주소에서 값을 가져와야 하는지는 실제 객체가 생성된 후인 런타임에서야 알 수 있다는 것이죠. 따라서 클래스의 멤버로 선언된 스태틱 변수는 컴파일타임에 로컬 스태틱 변수와 마찬가지로 전역 데이터 영역에 바인딩되어 사용됩니다. 그 결과로 해당 클래스의 모든 객체에서 동일한 변수를 사용하게 되는 것이지요.
사실, 스태틱 멤버 변수의 메모리 바인딩은 정확히는 링크 타임에 결정됩니다만.. 클래스 멤버의 경우에는 this를 기반으로 한 메모리 위치의 계산이 이루어지지 않는 다는 것에 초점이 맞춰진 언어설계라고 하겠습니다.
4) static member 함수 : 이 역시 멤버변수의 논의와 동일합니다. static 멤버함수는 그 함수 내에서 직접 참조하는 요소가 컴파일타임에 결정될 수 있을 것을 요구합니다. 즉, this포인터에 의해 위치가 변하는 멤버변수의 참조가 금지됩니다. 따라서 스태틱 멤버함수에서는 this포인터의 사용이 금지되지요. 그렇게 함으로써 static멤버만 접근할 수 있는 것이죠. 일반 멤버는 객체가 생성된 후인 런타임에만 그 위치를 결정할 수 있기 때문에 접근을 제한하도록 하는 메커니즘입니다.
또한, virtual 멤버함수는 어떤 함수가 실행될지는 런타임에 동적으로 바인딩된다는 것을 알려주는 키워드입니다. 따라서 당연히 정의로부터 static과 정면으로 대치되는 개념이지요. 결과적으로 한 멤버함수가 static이면서 동시에 virtual일수는 없습니다.
그리고 함수 뒤쪽에 static을 붙이는 선언 구문은 없습니다. 아마도 const지정자를 함수 뒤쪽에 붙이는 것에서 오해를 하신듯 한데, const지정자를 함수 앞에 붙일 경우 리턴 타입이 const인 것을 지정하는 구문과 구분할 수 없게 되므로 궁여지책으로 const지정자는 함수이름 뒤쪽으로 가게 된 것이죠.
하지만 static지정자는 함수 앞에 붙어도 다른 것과 혼동될 여지가 없으므로 앞에 붙게 되는 것입니다.
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/76
- 댓글 남기기
[URL] CVS 서버 제공: www.cvsdude.com (2MB 무료)
http://www.cvsdude.com
Subversion(SVN)과 CVS 두 가지 타입을 서비스한다.
무료는 2MB 를 준다.
작은 프로그램이라면 리소스 안올리면 모자라지는 않다!
WinCVS 에서 접속 커맨드 (using CVSDude)
Admin > Login :
cvs -d :pserver;username=byhou;password=zmfla77:byhou@cvs12.cvsdude.com:/cvs/stdq -P -- will
cvs co // check out
cvs up // update
cvs ci // check in
================================================================
CVS command
================================================================
CVS 초기화
# cvs -d /home/cvs init
CVS 프로젝트 초기화
$ cvs import -m "message" project_name vendor_tag release_tag
프로젝트를 시작할때
$ cvs checkout project_name 또는
$ cvs co project_name
업데이트된 내용을 받아올때
$ cvs update 또는
$ cvs up
수정된 내용을 Repository에 올릴때(Commit)
$ cvs commit -m "message" file_name 또는
$ cvs ci -m "message" file_name
새로운 파일을 더할때
$ cvs add file_name
$ [cvs update]
$ cvs commit -m "message" file_name
Repository의 파일을 지울때
$ rm file_name (일단 작업디렉토리에서 지워야 함)
$ cvs delete file_name
$ [cvs update]
$ cvs commit -m "message" file_name
출처: http://realxixi.egloos.com/814765
================================================================
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/75
- 댓글 남기기
Visual Assist 간단소개 및 단축키
[1] Visual Assist?
* Visual Assist 는 Visual Studio를 사용하여 소스를 코딩할 때
여러가지 도움을 주는 프로그램이다.
[2] 사용방법
1. 이 문서는 Visual Assist version 6.0.0.1092 를 기준으로 작성되었다.
이 version은 Visual Studio 6.0에 대응된다.
2. 설치는 VA6SETUP1090.exe 를 실행시키고 안내문에 따르면 된다.
3. Visual Studio를 실행시키면 자동으로 Visual Assist가 실행된다.
4. "ToolBar*" 라는 이름으로 Visual Assist ToolBar가 생성되므로,
이를 통해 여러가지 설정이나 각종 기능을 사용할 수 있다.
[3] 기능 소개
* 이 문서에서 "Symobl"이라 함은 변수, 상수, 함수를 의미한다.
* 각 단락의 제목은 Visual Assist Homapage에서 참조하였다.
(http://www.wholetomato.com)
1. 자동 완성(Auto Completion)
- 소스 내에서 언제라도 Symbol의 앞글자만 치고 Tab 키를 누르면
해당하는 글자로 시작하는 Symbol들의 리스트 박스가 뜬다.
- 어떤 Symbol을 타이핑 하려고 할 때 글자를 치면 글자 위에 Symbol을
추측해서 보여준다. 맞는 Symbol이 나왔을 때 Tab 키를 누르면
자동으로 Symbol을 완성해준다.
- t 만 치고 Tab 키를 누르면 자동으로 true 가 타이핑 된다.
- f 만 치고 Tab 키를 누르면 자동으로 false 가 타이핑 된다.
- a Tab assert()
- b Tab break
- c Tab case
- d Tab default
- r Tab return
- T Tab TRUE, F Tab FALSE, A Tab ASSERT()
- 위와 같이 C 예약어는 상황에 맞게 자동으로 타이핑 된다.
2. 자동 수정(Auto Correction)
- Symbol을 타이핑할 때 대문자, 소문자를 틀릴 경우 자동으로 수정된다.
- 스펠링을 틀릴 경우 Symbol에 밑줄이 그어진다.
- 포인터 변수에 "."을 타이핑 할 경우 자동으로 "->"로 수정된다.
- {}과 ()에 대해 짝이 맞는 지 자동으로 검사해서 색깔로 표시해 준다.
3. 자동 형 정보(Auto Type Info)
- Symbol을 클릭하면 소스 창 위에 자동으로 Symbol의 정보가 표시된다.
- 위 상황에서 정보표시 창 옆의 "goto"를 클릭하면 Symbol 선언부로
자동 이동한다.
- 클릭하지 않아도 Symbol 위에 마우스를 대고 있으면 정보가 표시된다.
4. 자동 인자 정보(Auto Parameter Info)
- 함수뿐만 아니라 메쏘드와 매크로에 대해서도 인자 정보가 표시된다.
5. 변환(Formatting)
- 클래스와 메쏘드에도 색을 지정할 수 있으며 일단 Visual Assist를
실행시키면 자동으로 색 변환이 되어진 소스를 보여준다.
- 컬럼 표시줄을 표시할 수 있다. 기본 값은 꺼져 있으므로 옵션에서
활성화 시키면 점선으로 된 컬럼표시줄을 볼 수 있다.
- 칼라를 사용하여 소스를 프린트 할 수 있다.
6. 기타(Miscellaneous)
- 멀티플 클립보드 버퍼를 지원한다. Shift+Ctrl+V 키를 이용하면
클립보드에 카피한 내용이 나오고 그 중 선택해서 paste 할 수 있다.
- 오른쪽 마우스 클릭으로 불러지는 메뉴가 강화된다. 예를 들면
블럭을 지정해서 /* */ 자동으로 넣기 등이 가능해진다.
- { 를 타이핑 하면 자동으로 } 가 타이핑 된다.
* 이외에도 여러 기능들이 있다.
[4] Visual Assist ToolBar
* ToolBar의 왼쪽부터 차례대로 설명한다. 괄호 안은 단축키이다.
1. Option(단축키 없음) : Visual Assist의 여러 기능들을 변경, 설정할 수 있다.
2. Goto Method(Alt+M) : 메쏘드의 리스트를 보여준다.
5. Open Project File(Alt+Shift+O) : 현재 프로젝트에 해당하는 파일들을
보여주고 Open할 수 있게 해준다.
7. Paste Multiple(Shift+Ctrl+V) : 멀티플 클립보드 버퍼 내용을 보여주고
paste할 수 있게 한다.
8. Insert Code Template(없음) : 템플릿 코드를 삽입시킨다.
9. Context Menu(Shift+오른쪽 마우스 버튼) : 확장 Context 메뉴를 실행시킨다.
10. Find Previous(없음) : 현재 마우스커서가 가르키고 있는 Symbol을 이전에서
찾는다.
11. Find Next(Alt+Shift+F3) : 현재 마우스커서가 가르키고 있는 Symbol을
이후에서 찾는다.
12. Comment Selection(없음) : 선택된 부분의 앞뒤에 자동으로 /* */ 를 넣는다.
13. Comment Selection(없음) : 선택된 부분의 앞에 자동으로 // 를 넣는다.
14. Spell Check(없음) : 선택된 부분에서 스펠링 체크를 한다.
15. Reparse(없음) : 현재 파일을 Reparse한다. (정확한 기능을 모르겠으나
현재 파일을 Visual Assist에 맞게 다시 변경하는 것으로 추측된다)
16. Enable/Disable(없음) : Visual Assist를 활성화/비활성화 한다.
출처: 네이버 검색 2003.04.03 자료
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/74
- 댓글 남기기
병렬처리 방법 #2. 컴파일러가 지원하는 OpenMP !
2008/03/24
우연히 ZDNet에서 본 동영상: 프로그램 내에 병렬처리를 가능케 하기 위해 어떻게 해야 하는가?
▲ 아저씨 왜 그렇게 잘아셩~ *.*?
컴파일러가 지원하는 OpenMP < 이런게 있었단다 헐;
MSDN 검색해보니 'parallel OpenMP directive' 라고 있었다. 역시..
#include <windows.h>
#include <time.h>
#include <stdio.h>
#include <omp.h>
#include <conio.h>
int main()
{
DWORD t1 = GetTickCount();
struct tm when;
__time64_t before, after, result;
time( &before );
#pragma omp parallel for (i, j, k)
{
for( int i = 0; i < 100; i++ ) //int i = omp_get_thread_num();
{
printf_s("[i] Hello from thread %d\n", i);
for( int j = 100; j < 150; j++ )
{
printf_s("\t[j] Hello from thread %d\n", j);
for( int k = 1000; k < 1100; k++ )
{
printf_s("\t\t[k] Hello from thread %d\n", k);
}
}
}
}
time( &after );
result = after - before;
_localtime64_s( &when, &result );
DWORD t2 = GetTickCount();
printf_s( "%d sec", when.tm_sec );
_getch();
}
[/CODE]
돌려봤다;
27초 : 28초
밀리초 단위로 재봐야 확실히 나올듯하다.
아무튼 오늘은 컴파일러가 저런것도 지원한다는 것의 발견.. >_</
동영상 설명중 병렬처리 가장 많이 쓰는 방법: threading building blocks 는 아래 사이트 참조!
http://threadingbuildingblocks.org/
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/73
- 댓글 남기기
[ERROR] 힙이 손상되었거나 Sample1.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.
에러:)
힙이 손상되었거나 Sample1.exe 또는 여기서 로드한 DLL에 버그가 있을 수도 있습니다.
해결:)
서로 다른 CRT 버전을 사용했기 때문에 링크 단계에서 라이브러리 간에 기호 충돌 문제가 발생한다. 이 경우에는 CRT가 모두 일치하도록 라이브러리를 새로 구성한 다음 컴파일 하도록 한다. 라이브러리를 자신이 만들지 않은 경우에는 이 또한 여의치 않다. 이 경우에는 프로젝트 설정 대화상자에서 링크 부분에서 라이브러리 무시에 충돌이 나는 라이브러리를 추가한 다음 컴파일 하도록 한다. 종종 링크 순서 때문에 문제가 발생하기도 한다. 이 경우에는 무시 라이브러리에 모두 추가한 다음 링크 순서대로 추가 종속성에 적어두면 된다.
DLL 때문에 가장 많이 겪는 문제 중에 하나는 new/delete 문제다. DLL과 EXE가 서로 각각 CRT를 링크한 경우(싱글 스레드, 멀티 스레드)에는 서로 다른 힙을 사용한다. 따라서 DLL에서 new한 것을 EXE에서 delete하거나, 반대로 EXE에서 new한 것을 DLL에서 delete하는 경우에 문제가 생긴다. 이 경우엔 new/delete의 위치가 동일하도록 프로그램 구조를 고치거나 아니면 DLL과 EXE 모두 멀티 스레드 DLL을 사용하도록 설정해야 한다.
이러한 복잡한 문제들을 사전에 방지하기 위해서는 CRT를 되도록 통일해서 사용하고, DLL 경계에서 new/delete를 하지 않도록 프로그램을 작성하는 것이 좋다.
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/71
- 댓글 남기기
[STL] 요약 : container, iterator, algorithm, 함수자(functor), adaptor, allocator
| 컨테이너(container) |
C 언어의 배열처럼 동일한 요소들을 모아놓은 집합을 뜻합니다. 구조체는 각기 다른 자료형을 내부적으로 유지하지만, 컨테이너는 반드시 동일한 요소로 구성되어 있어야 합니다.
컨테이너에는 순차 컨테이너(sequence container)와 정렬 연관 컨테이너(sorted associative container)가 있습니다. STL에 들어 있는 모든 컨테이너는 고정된 크기를 갖는 것이 아니라 동적으로 크기를 언제든지 변경할 수 있습니다.
* 순차 컨테이너(sequence container)
순차 컨테이너는 동일한 객체가 선형으로 구성된 집합(collection)으로, 실행시에 동적으로 크기를 변경할 수 있습니다. 순차 컨테이너에는 다음과 같은 컨테이너가 포함되어 있습니다.
순차 컨테이너 종류 (컨테이너 / 호칭 / 설명)
vector / 벡터 /
1. 구성 요소에 임의로 접근할 수 있습니다. (모든 요소에 접근할 때의 소요 시간이 동일합니다.)
2. 집합 끝에서 발생하는 삽입과 삭제는 신속히 처리하지만, 처음과 중간에 대해서는 해당 위치 다음에 있는 요소들의 개수에 비례해서 처리됩니다.
deque / 덱 /
1. 구성 요소에 임의로 접근할 수 있습니다. (모든 요소에 접근할 때의 소요 시간이 동일합니다.)
2. 집합의 양 끝(시작과 끝)에서 발생하는 삽입과 삭제를 신속히 처리하지만, 중간에 대해서는 해당 위치 다음에 양쪽에 있는 요소들의 개수에 비례해서 처리됩니다.
list / 리스트 /
1. 구성 요소에 선형적으로 접근합니다. (요소의 개수에 따라서 접근 소요 시간이 늘어나고, 요소 위치에 따라서 소요 시간이 다릅니다.)
2. 집합 내의 어디에서나 구성 요소의 삽입과 삭제가 동일한 시간으로 신속히 처리됩니다.
* 정렬 연관 컨테이너(sorted associative container)
정렬 연관 컨테이너는 키(key)를 사용해서 데이터를 신속하게 찾아낼 수 있는 집합으로, 순차 컨테이너와 마찬가지로 실행 시에 동적으로 크기를 변경할 수 있습니다. 정렬 연관 컨테이너에는 다음과 같은 컨테이너가 포함되어 있습니다.
정렬 연관 컨테이너 종류 (컨테이너 / 호칭 / 설명)
set / 셋 /
1. 집합에는 키만 저장할 수 있습니다.
2. 중복되지 않는 키를 지원합니다. 따라서, 동일한 키가 두 개 존재할 수 없습니다.
3. 원하는 키를 신속하게 찾아냅니다.
multiset / 멀티셋 /
1. 집합에는 키만 저장할 수 있습니다.
2. 중복 키를 지원합니다. 따라서, 여러 개의 복사본을 가질 수 있습니다.
3. 원하는 키를 신속하게 찾아냅니다.
map / 맵 /
1. 집합에는 키와 데이터를 함께 저장합니다.
2. 중복되지 않는 키를 지원합니다. 따라서, 동일한 키가 두 개 존재할 수 없습니다.
3. 키를 사용해서 원하는 객체를 신속하게 찾아줍니다.
multimap / 멀티맵 /
1. 집합에는 키와 데이터를 함께 저장합니다.
2. 중복 키를 지원합니다. 따라서, 여러 개의 복사본을 가질 수 있습니다.
3. 키를 사용해서 원하는 객체를 신속하게 찾아줍니다.
반복자(iterator)
STL의 모든 연산은 컨테이너에 대해서 적용될 수 있도록 고안되었습니다. 그래서, 컨테이너의 요소 하나, 일정 범위의 구간, 전체에 대해서 연산을 적용할 수 있도록 세분화되어 있습니다. 반복자는 컨테이너로부터 값을 읽어 올 수 있는 방법을 제공해 줍니다. 벡터와 같은 컨테이너는 []연산자를 통해서도 값을 읽어 올 수 있지만, 모든 컨테이너에 대해서 사용할 수 있는 방법은 아닙니다. 따라서, 우리는 모든 컨테이너에 대해서 동일하게 동작할 수 있도록 값을 읽어 오는 방법을 익혀야 합니다.
"반복자는 포인터이다"라고 생각하면 좋습니다. 포인터를 제대로 다룰 줄 알면 더 바랄 것이 없습니다. 그러나, 실제로는 포인터가 반복자의 일부입니다. 단지, C++라는 언어가 포인터라는 개념을 이미 갖고 있었고, 기존의 프로그래머들이 모두 능숙하게 포인터를 다룰 수 있기 때문에, C++ 표준 위원회는 STL의 개념이 포인터가 갖고 있는 몇 가지 특징들을 포함하도록 했습니다.
STL은 이미 알려진 자료 구조를 템플릿을 사용해서 구현한 코드입니다. 누구나 리스트와 맵이라는 자료 구조를 구현할 줄 알고 있습니다. 그러나, 실제로 구현했을 경우 코드 또한 완전히 같을 수 있을까요? 그렇지는 않을 겁니다. 성능을 향상시킨다고 나름대로 많은 기교를 부릴 게 틀림없습니다. 그래서, 우리는 벡터가 일반 배열처럼 동작한다는 것은 알지만, 어떻게 구현했는지는 알 수 없습니다. "이렇게 구현했겠지"하고 추측하는 것만큼 위험한 것은 없습니다. 컴파일러를 제작하는 회사마다 다릅니다.
이렇게 각기 다르게 구현된 컨테이너에 대해서 제대로 동작하려면, 반복자에 대해서도 몇 가지 제한이 필요합니다. 가령, "벡터 컨테이너의 반복자는 어떠어떠한 기능을 지원해야 한다"입니다. 셋의 경우도 순차적으로 진행되는 컨테이너가 아니기 때문에, 벡터에서 지원하는 [] 연산자를 지원하지 않습니다. 지원할 수도 있지만, 일반적으로 셋을 표현하는 자료 구조의 환경 때문에, [] 연산자를 적용했을 경우 효율이 떨어질 뿐더러 별로 의미가 없습니다. 모든 컨테이너는 어떠한 기능의 반복자가 필요한지 STL 규정에 이미 정해 두었습니다.
반복자의 종류
반복자 / 설명
입력 : Input /
1. 두 개의 반복자, first와 last에 대해서 first != last 라는 식에 대해서 참을 반환해야 합니다.
2. ++first 연산을 수행하면, 반복자 first 다음 요소의 위치를 반환해야 합니다.
3. *first 연산을 수행하면, 반복자 first가 가리키는 값을 반환해야 합니다.
그러나, 다음 코드는 사용할 수 없습니다. 입력 반복자는 읽기 전용입니다.
*first = 5;
4. 컨테이너의 요소를 검색하는 find 알고리즘에서 사용됩니다.
출력 : output /
1. ++first 연산을 수행하면, 반복자 first 다음 요소의 위치를 반환해야 합니다.
2. *first 연산을 수행하면, 반복자 first가 가리키는 곳에 값을 저장합니다.
그러나, 다음 코드는 사용할 수 없습니다. 출력 반복자는 쓰기 전용입니다.
N = *first
3. 컨테이너의 요소를 복사하는 copy 알고리즘에서 사용됩니다.
순방향 : forward /
1. 입력 반복자와 출력 반복자의 모든 기능을 포함합니다.
2. 한 쪽 방향으로만 순회할 수 있습니다.
3. 반복자의 위치를 저장해 두었다가 저장한 위치부터 다시 순회할 수 있습니다.
4. 컨테이너의 요소를 읽고 쓰는 replace 알고리즘에 사용됩니다.
양방향 : bidirectional /
1. 순방향 반복자의 모든 기능을 포함한다.
2. 양쪽 방향으로의 순회가 가능합니다.
따라서, --first 연산을 수행하면, 이전 요소의 위치를 반환해야 합니다.
3. 컨테이너의 요소들을 뒤집을 수 있는 reverse 알고리즘에서 사용됩니다.
임의접근 : random access /
1. 양방향 반복자의 모든 기능을 포함합니다.
2. 컨테이너의 모든 요소에 접근 소요 시간이 동일합니다.
3. +, -, +=, -=, [] 연산자를 지원해야 합니다.
4. <, >, <=, >= 연산자를 지원해야 합니다.
5. 컨테이너의 요소를 이진 검색하는 binary_search 알고리즘에서 사용됩니다.
반복자에는 위의 표에서 나열한 것 외에, 편리를 위해서 제공되는 반복자가 몇 개 더 있습니다.
1. 삽입 반복자(insert iterator)
* 후위 삽입 반복자 : back_insert_iterator
컨테이너의 push_back 함수를 사용해서, 컨테이너의 마지막에 요소를 자동으로 삽입하는 반복자로, 축약해서 back_insertor로 쓸 수 있습니다.
* 전위 삽입 반복자 : front_insert_iterator
컨테이너의 push_front 함수를 사용해서, 컨테이너의 처음에 요소를 자동으로 삽입하는 반복자로, 축약해서 front_insertor로 쓸 수 있습니다.
* 삽입 반복자 : insert_iterator
컨테이너의 insert 함수를 사용해서, 컨테이너의 중간에 요소를 자동으로 추가해 주는 반복자로, 축약해서 insertor로 쓸 수 있습니다.
2. 스트림 반복자(stream iterator)
* 입력 스트림 반복자(istream_iterator)
입력 반복자의 한 종류로, 스트림으로부터 한 쪽 방향으로 읽어나갈 수 있습니다. 따라서, cin과 같은 표준 입력 스트림(키보드)으로부터 입력을 받을 수 있습니다.
istream_iterator<Type>()는 입력 스트림의 끝을 나타내는 반복자, 컨테이너의 멤버 함수인 end 함수와 같은 역할을 합니다.
* 출력 스트림 반복자(ostream_iterator)
출력 반복자의 한 종류로, 스트림으로부터 한 쪽 방향으로 출력해 나갈 수 있습니다. 따라서, cou과 같은 표준 출력 스트림(모니터)으로 출력을 할 수 있습니다.
3. 참조 반복자(reference iterator)
* 수정 반복자(mutable iterator)
반복자를 사용해서 값을 변경할 수 있는 반복자로, 일반 반복자인 vector<int>::iterator등이 여기에 해당됩니다.
* 상수 반복자(const_iterator)
반복자를 사용해서 값을 변경할 수 없는 반복자로, vector<int>::const_iterator로 생성할 수 있습니다. 상수 반복자 it에 대해서 다음 코드는 에러입니다.
set<int> set1;
set1.insert(3);
set<int>::iterator it = set1.begin();
*it = 5; // 에러. it는 상수 반복자.
위의 코드는 아래와 같이 변경되어야 합니다. 셋을 구현할 자료 구조의 특성 때문에. 셋은 항상 상수 반복자만을 제공합니다.
set1.erase(it);
set1.insert(5);
알고리즘(algorithm)
컨테이너에 대해서 적용할 수 있는 기능들을 체계적으로 정리해 놓은 함수들을 말합니다. 알고리즘에 속한 함수는 모두 일반적(generic)이기 때문에, 어떤 하나의 컨테이너가 아니라 여러 컨테이너에 대해서 동작합니다. 여기서 모든 컨테이너가 아니라 여러 컨테이너인 것은 기능의 효율성 때문에, 적합하지 않은 컨테이너(자료구조)에 대해서는 지원하지 않기 때문입니다.
알고리즘에 포함된 함수는 모두 4개지로 분류할 수 있습니다.
* 변경 불가 순차 알고리즘(nonmutating sequence algorithm)
* 변경 가능 순차 알고리즘(mutating sequence algorithm)
* 정렬 관련 알고리즘(sorting-related algorithm)
* 범용 수치 알고리즘(generalized numeric algorithm)
변경 불가 순차 알고리즘(nonmutating sequence algorithm) 종류
함수 / 설명
find / 원하는 요소를 검색합니다.
find_if / 조건자를 true가 되게 하는 첫 번째 요소를 검색합니다.
adjacent_find / 동일한 두 개의 원소가 이웃하고 있는 쌍을 검색합니다.
count / 특정 값과 일치하는 요소의 개수를 반환합니다.
count_if / 조건자를 true가 되게 하는 요소의 개수를 반환합니다.
for_each / 인자로 넘어간 함수를, 요소 전체에 대해서 호출합니다. for문과 같은 반복문을 대신 해서 사용할 수 있습니다.
equal / 두 개의 구간이 일치하면, true를 반환합니다.
mismatch / 두 개의 구간이 일치하지 않으면, true를 반환합니다.
search / 구간 내에 포함된 하위 구간을 검색합니다. C 함수의 strstr 함수와 비슷한 역할을 합니다.
변경 가능 순차 알고리즘(mutating seqence algorithm)종류
함수 / 설명
copy / 특정 구간에 속하는 원소를 다른 구간으로 복사합니다. 구간이 중복될 경우, 왼쪽으로의 이동만 허용합니다.
copy_backward / 특정 구간에 속하는 원소를 다른 구간으로 복사합니다. 구간이 중복될 경우, 오른쪽으로의 이동만 허용합니다.
fill / 구간에 속하는 모든 원소를 주어진 값으로 채웁니다.
fill_n / 시작 위치에서부터 n 개의 요소를 주어진 값으로 채웁니다.
generate / 구간에 들어 있는 요소 각각에 대해 인자로 넘어간 함수를 호출하고, 그 결과로 다시 요소를 채웁니다. 구간 내의 요소는 함수의 결과값으로 채워집니다.
partition / 구간 내에서 주어진 값보다 작은 요소는 앞쪽에, 큰 요소는 뒤쪽에 오도록 재배치합니다.
stable_partition / 구간 내에서 주어진 값보다 작은 요소는 앞쪽에, 큰 요소는 뒤쪽에 오도록 재배치하면서, 최초의 상대적인 위치를 그대로 유지합니다.
random_shuffle / 구간 내의 요소를 난수로 채웁니다.
remove / 주어진 값과 일치하는 구간 내의 모든 요소를 삭제합니다. 그러나, 실제로 삭제되는 것이 아니고, 가장 뒤쪽으로 자리르 변경합니다. 실제 삭제는 erase 함수를 사용합니다.
replace / 주어진 값과 일치하는 구간 내의 요소들을 지정한 값으로 치환합니다.
reverse / 구간 내의 모든 요소들을 거꾸로 뒤집어서 재배치합니다.
rotate / 구간 내의 모든 요소를 주어진 위치를 중심으로 한 바퀴 돌립니다.
swap / 두 개의 값을 교환합니다.
swap_ranges / 두 구간에 속하는 값들을 교환합니다.
transfrom / 구간에 속하는 요소 각각에 대하여, 인자로 넘어간 함수를 호출한 결과를 다른 구간에 저장합니다.
unique / 구간 내에 속한 모든 중복된 요소를 제거함으로써, 해당 요소가 유일하도록 만듭니다. remove 함수처럼, 실제로 삭제가 일어나는 것이 아니고, 구간의 맨 뒤로 이동시켜 놓기 때문에, 컨테이너의 크기에는 변화가 없습니다.
정렬 관련 알고리즘(sorting-related algorithm) 종류
함수 / 설명
sort / 구간을 정렬합니다. (quick-sort)
stable_sort / 구간을 정렬합니다. 동등한 요소의 상대적인 위치를 유지합니다. (merge-sort)
partial_sort / 구간을 정렬합니다. 동등한 요소의 상대적인 위치를 유지하지 않습니다. (heap-sort)
nth_element / 구간이 정렬되었을 경우, N번째 위치에 놓이게 될 요소만 놓고, 나머지 요소들은 N보다 작은 값들을 왼쪽에, 큰 값들을 오른쪽에 배치한다
binary_search / 정렬되어 있는 구간으로부터 요소를 검색합니다. (이진 검색)
lower_bound / 이진 검색을 사용해서 정렬된 구간을 검색한 후, 동일한 값들이 연속되어 있을 경우 맨 앞의 요소를 반환합니다.
upper_bound / 이진 검색을 사용해서 정렬된 구간을 검색한 후, 동일한 값들이 연속되어 있을 경우 맨 마지막의 요소를 반환합니다.
equal_range / 이진 검색으로 검색한 값이 동일하게 연속된 구간을 반환합니다. lower_bound와 upper_bound 함수의 결과를 합한 결과가 반환됩니다.
merge / 두 개의 정렬된 구간을 병합해서, 중복되지 않는 구간에 결과를 저장합니다.
inplace_merge 두 개의 정렬된 구간을 병합해서, 중복되지 않는 구간에 결과를 저장합니다.
includes / 주어진 정렬된 구간의 요소들이 다른 구간에 속하는지를 반환합니다.
set_union / 정렬된 두 개 구간의 합집합을 다른 구간에 저장합니다.
set_difference / 정렬된 첫 번째 구간에 속한 요소들 중에서 정렬된 두 번째 구간에 속하지 않는 요소들을 다른 구간에 저장합니다.
set_intersection / 정렬된 두 개의 구간에 공통으로 속한 요소들을 다른 구간에 저장합니다.
set_symmetric_defference / 정렬된 두 개의 구간에서, 한 쪽 구간에만 속해있는 요소들을 다른 구간에 저장합니다.
make_heep / 구간 내의 요소들을 힙(heep)으로 재구축 합니다.
sort_heep / 힙에 저장된 원소들을 정렬합니다.
push_heap / 주어진 구간을 힙으로 유지하면서, 새로운 요소를 힙에 추가합니다.
pop_heap / 주어진 구간을 힙으로 유지하면서, 가장 큰 요소를 삭제합니다.
min / 두 개의 요소 중, 작은 값을 반환합니다.
max / 두 개의 요소 중, 큰 값을 반환합니다.
lexicographical_compare / 두 개의 구간을 사전 순서로 비교해서 결과를 반환합니다.
next_permutation / 주어진 구간을 사전 순서에 기초해서, 다음 순열로 변경합니다.
prev_permutation / 주어진 구간을 사전 순서에 기초해서, 이전 순열로 변경합니다.
범용 수치 알고리즘(generalized numeric algorithm) 종류
함수 / 설명
accumulate / 주어진 구간에 속하는 요소들의 합계를 구합니다.
partial_sum / 주어진 구간의 요소를 기초로, 부분합을 구합니다.
adjacent_difference / 주어진 구간의 요소를 기초로, 이웃하는 요소의 차이를 구합니다.
inner_product / 주어진 두 구간의 내적(inner product)을 구합니다.
함수자(functor)
함수 객체(function object)라고도 부르며, 0개 이상의 인자를 받아서 알고리즘의 기본 동작을 변형하거나 확장시켜 주는 객체를 얘기합니다. 따라서, 우리가 지금까지 사용해 오던 함수도 함수자에 속합니다. 함수 포인터를 인자로 받아서, 알고리즘 내부에서 해당 함수를 사용할 경우, 알고리즘이 확장될 수 있기 때문입니다.
그러나, STL에서는 함수자로서 함수를 많이 사용하지 않습니다. 함수 포인터를 인자로 사용했을 경우의 단점은, 반환값과 인자가 동일한 함수에 대해서만 동작하기 때문입니다. 그래서, 범용성이 떨어지게 됩니다. 또한, 함수 포인터를 사용하기 때문에, 매번 함수를 호출할 때마다 포인터를 통해서 접근해야 할 뿐더러 해당 함수를 호출할 때마다 메모리 할당과 해제 또한 책임져야 합니다.
그래서, 성능면에서 많은 문제가 발생합니다.
함수 포인터를 사용했을 경우 발생하게 되는 위의 문제점들을 해결하기 위해, STL은 클래스를 인자로 사용합니다. 함수 대신 사용하는 클래스는 반드시 () 연산자를 재정의해야 합니다. 이렇게 함수를 직접 넘기지 않고 클래스를 통해서 구현된 함수 객체를 넘길 때의 장점은, 지정된 클래스로 형변환될 수 있는 모든 클래스를 인자로 사용할 수 있기 때문에 범용성이 확보된다는 것입니다. 여기서 지정된 클래스로의 변환은, 인자로 사용가능한 클래스를 상속받음으로써 해결할 수 있습니다.
두 번째로 성능과 관련된 문제는, 클래스 내부에서 구현된 () 연산자 오버로딩 함수는, 코드가 짧기 때문에 충분히 인라인(inline) 함수로 구현이 가능하기 때문에, 함수 호출과 관련된 부담에서 벗어날 수 있습니다. 더불어 추가적으로 생기는 장점은, 함수에서 누적되는 등의 용도로 사용하는 어떤 정보가 필요하다면, 함수 포인터의 경우 전역 변수를 사용해야 하지만 클래스는 멤버 변수로 쉽게 관리할 수 있습니다.
함수자의 종류로는 말 그대로 함수자와 함수 어댑터(adaptor)가 있습니다. 함수자는 함수 포인터나 클래스를 사용해서 함수의 기능을 변경하는 것을 말하고, 함수 어댑터는 함수자의 기능을 변형해서 새로운 함수자를 생성합니다.
다음은 STL이 제공하는 연산자를 구현한 클래스 함수자들로, 산술 연산, 비교 연산, 논리 연산에 대한 함수자를 제공합니다.
산술 연산 함수자 종류
연산자 / 이름 / 설명
덧셈(+) / plus / x와 y의 합을 반환합니다. (x + y, 이항 함수자)
뺄셈(-) / minus / x와 y의 차를 반환합니다. (x - y, 이항 함수자)
곱셈(*) / multiplies / x와 y의 곱을 반환합니다. (x * y, 이항 함수자)
나눗셈(/) / divides / x와 y의 몫을 반환합니다. (x / y, 이항 함수자)
나머지(%) / modulus / x와 y의 나머지를 반환합니다. (x % y, 이항 함수자)
부정(-) / negate / x의 부호를 변경한 값을 반환합니다. (-x, 단항 함수자)
비교 연산 함수자 종류
연산자 / 이름 / 설명
같다(==) / equal_to / x가 y와 같은지 비교합니다. (x == y, 이항 함수자)
같지 않다(!=) / not_equal_to / x가 y와 같지 않은지 비교합니다. (x != y, 이항 함수자)
크다(>) / greater / x가 y보다 큰지 비교합니다. (x > y, 이항 함수자)
작다(<) / less / x가 y보다 작은지 비교합니다. (x >= y, 이항 함수자)
작거나 같다 (<=) / less_equal / x가 y보다 작거나 같은지 비교합니다. (x <= y, 이항 함수자)
논리 연산 함수자 종류
연산자 / 이름 / 설명
And(&&) / logical_and / x와 y를 AND 연산합니다. (x && y, 이항 함수자)
OR(||) / logical_or / x와 y를 OR 연산합니다. (x || y, 이항 함수자)
NOT(!) / logical_not / x를 NOT 연산합니다. (!x, 단 항 함수자)
함수 어댑터(function adaptor)
* 바인터(binder)
두개의 인자를 필요로 하는 이항 함수 객체의 인자 하나를 고정시켜서, 인자를 하나만 요구하는 단항 함수 객체로 변환시켜 줍니다.
* 부정자(negator)
함수 인자로 사용되는 조건자의 의미를 반대로 변환시켜 줍니다.
* 함수 포인터 어댑터(adaptors for pointers to functions)
단항이나 이항 함수 포인터를 라이브러리가 제공하는 함수 어댑터와 사용할 수 있도록 도와줍니다.
* 멤버 함수 포인터 어댑터(adaptors for pointers to member functions)
단항이나 이항 멤버 함수 포인터를 라이브러리가 제공하는 함수 어댑터와 사용할 수 있도록 도와줍니다.
바인더(binder) 어댑터
* bind1st
함수자에 전달되는 두 개의 인자 중, 첫 번째 인자를 고정값으로 사용할 수 있도록 도와주는 바인더
* bind2nd
함수자에 전달되는 두 개의 인자 중, 두 번째 인자를 고정값으로 사용할 수 있도록 도와주는 바인더
부정자(negator) 어댑터
* not1 / 인자로 전달된 단항 조건자의 의미를 반대로 변환합니다.
* not2 / 인자로 전달된 이항 조건자의 의미를 반대로 변환합니다.
함수 포인터 어댑터(adaptors for pointers to functions)
* ptr_fun / 단항 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다.
* ptr_fun / 이항 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다.
멤버 함수 포인터 어댑터(adaptors for pointers to member functions)
* mem_fun / 인자가 없는 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다.
* mem_fun / 단항 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다.
* mem_fun_ref / 인자가 없는 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다. 인자가 없는 멤버 함수 어댑터인 mem_fun의 레퍼런스(&) 버전입니다.
* mem_fun_ref / 단항 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다. 단항 멤버 함수 어댑터인 mem_fun의 레퍼런스(&) 버전입니다.
* mem_fun / 인자가 없는 const 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다. 인자가 없는 멤버 함수 어댑터인 mem_fun의 상수(const) 버전입니다.
* mem_fun / 인자가 없는 const 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다. 단항 멤버 함수 어댑터인 mem_fun의 상수(const) 버전입니다.
* mem_fun_ref / 인자가 없는 const 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다. 인자가 없는 멤버 함수 어댑터인 mem_fun_ref의 상수(const) 버전입니다.
* mem_fun_ref / 단항 const 멤버 함수를 함수 어댑터처럼 사용할 수 있도록 지원합니다. 단항 멤버 함수 어댑터인 mem_fun의 상수(const) 버전입니다.
어댑터(adaptor)
어댑터는 컨테이너의 인터페이스 또는 함수자의 기능을 변경하는 컴포넌트를 말합니다. 가령, 기존의 컨테이너를 사용해서 스택을 꾸미고 싶을 때는 스택 어댑터(stack adaptor)를, 함수자의 의미를 변경할 때는 바인더(binder)나 부정자(negator) 등을 사용합니다.
어댑터의 종류
1. 컨테이너 어댑터(container adaptor)
* 스택 어댑터(stack adaptor)
- 스택(stakc) 자료구조를 표현하는 어댑터를, 스택 인터페이스로 변환합니다.
- 스택 : 한 쪽 끝에서만 삽입과 삭제가 일어나고, 먼저 집어넣은 것을 마지막에 꺼냅니다. (FILO : file-in, last-out)
*큐 어댑터(queue adaptor)
- 큐(queue) 자료구조를 표현하는 어댑터로, 큐 인터페이스로 변환합니다.
= 큐 : 한 쪽 끝에서 삽입이, 반대쪽 끝에서 삭제가 일어나고, 먼저 집어 넣은 것을 먼저 꺼냅니다(first-in, first-out)
* 우선 순위 큐 어댑터(priority queue adaptor)
- 우선 순위 큐(priority queue) 자료구조를 표현하는 어댑터로, 우선 순위 큐 인터페이스로 변환합니다.
- 우선 순위 큐 : 한 쪽 끝에서 삽입이, 반대쪽 끝에서 삭제가 일어나고, 항상 가장 큰 값을 먼저 꺼냅니다.
2. 함수 어댑터(function adaptor)
* 바인더(binder)
- 두 개의 인자를 필요로 하는 이항 함수 객체의 인자 하나를 고정시켜서, 인자를 하나만 요구하는 단항 함수 객체로 변환시켜 줍니다.
* 부정자(negator)
- 함수 인자로 사용되는 조건자의 의미를 반대로 변환시켜 줍니다.
* 함수 포인터 어댑터(adaptor for pointers to functions)
- 단항이나 이항 함수 포인터를 라이브러리가 제공하는 함수 어댑터와 사용할 수 있도록 도와줍니다.
* 멤버 함수 포인터 어댑터(adaptors for pointers to member functions)
- 단항이나 이항 멤버 함수 포인터를 라이브러리가 제공하는 함수 어댑터와 사용할 수 있도록 도와줍니다.
3. 반복자 어댑터(iterator adaptor)
* 역 반복자 어댑터(reverse iterator adaptor)
- 반복자의 인터페이스를 변경합니다.
- 역 반복자 어댑터 하나 밖에 없습니다.
- reverse_iterator 클래스의 base 함수로 구할 수 있습니다.
- 각 컨테이너마다 역 반복자를 제공하기 때문에, 굳이 반복자 어댑터를 사용할 필요는 없습니다.
할당자(allocator)
메모리를 어떻게 할당해야 할지를 결정합니다. 가령, 자신이 만든 컨테이너가 일반적으로 사용하는 malloc이나 VirtualAlloc 함수 또는 new 연산자를 사용해서 동적 메모리를 할당할 수 없을 경우에 사용합니다.
기본 할당자(allocator)
1. 헤더 파일
#include <memory>
2. 선언
template <typename Type> class allocator;
3. 기본 할당자로 지정된 allocator 클래스의 경우, 할당자를 지정하지 않은 모든 컨테이너에 대해 공통적으로 사용됩니다. allocator 클래스는 메모리 할당에 new와 delete 연산자를 사용합니다.
4. 메모리 할당에 많은 시간이 소요되서는 안 되기 때문에, 최소한의 상수 시간내에 할당이 이루어 집니다.
사용자 정의 할당자(custom allocator)
1. 기본 할당자가 갖고 있는 기능에 새로운 기능을 추가하기 위해 사용합니다.
2. 가령, 디버거의 용도로 사용할 수 있는 할당자가 있다면, 코드를 디버깅하기 위한 용도로 STL과 결합할 수 있습니다. 디버거 할당자는 동적으로 할당된 모든 메모리를 보여주고, 누수를 탐지하는 기능을 가질 것입니다.
3. 그러나, 기본 할당자만으로 메모리 할당은 충분하기 때문에, 별도의 할당자를 만들거나 하지 않습니다.
4. 새로운 할당자가 debug_allocator 클래스에 구현되어 있을 경우, 아래 코드처럼 벡터 컨테이너를 비롯한 모든 컨테이너에 대해 적용할 수 있습니다.
vector< int, debug_allocator<int> >v;
출처: 누군가의 네이버 블로그~
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/70
- 댓글 남기기
[Visual C++/MSDN] 도움말 항목에서 코드 예제 컴파일 방법
Visual Studio 2005 문서에는 사용자가 만들 수 있는 프로그램의 형식을 보여 주는 코드 예제가 들어 있습니다. Visual Studio 도움말 메뉴에서 이러한 예제 프로그램의 소스 코드를 볼 수 있습니다.
이러한 예제 프로그램은 일반적으로 콘솔 응용 프로그램입니다. 콘솔 응용 프로그램은 완전한 프로그램으로 작성해도 크기가 크지 않기 때문에 예제로 사용하기에 적합합니다. 코드 예제는 언제라도 사용자의 프로젝트에 복사하여 붙여넣을 수 있습니다.
이 절차에서는 도움말 항목에서 Visual C++ 코드 예제 프로그램을 찾는 방법과 이 프로그램을 컴파일하여 실행하는 방법에 대해 설명합니다.
예제 Visual C++ 프로그램을 클립보드에 복사하려면
-
도움말 메뉴에서 목차를 클릭합니다.
-
필터링 기준 목록을 Visual C++로 설정합니다.
-
예제 프로그램 중 하나를 찾습니다.
목차 영역에서 개발 도구 및 언어, Visual Studio, Visual C++ 및 프로그래밍 가이드의 트리 노드를 차례로 엽니다.
Visual C++ Express Edition을 사용하는 경우 Visual Studio용 Express Library, Visual C++ Express Edition 및 프로그래밍 가이드 노드를 차례로 엽니다.
-
도움말의 이 영역에는 많은 예제 프로그램이 있습니다.
예를 들어, C++로 .NET 프로그래밍과 Windows 작업을 열고 방법: 시작 후 경과한 시간 검색 항목을 선택합니다.
이렇게 하면 환경이 어떻게 구성되어 있는지에 따라 도움말 브라우저나 Visual Studio의 창에 해당 항목이 열립니다.
-
코드 복사 단추를 클릭하여 예제 프로그램을 클립보드에 복사합니다.
-
클립보드에 소스 코드를 복사하면 다음 중 하나를 수행할 수 있습니다.
-
Visual Studio에서 현재 프로젝트에 새 .cpp 파일을 추가하고 소스 코드를 이 파일에 붙여넣은 다음 방법: Visual Studio에서 CLR를 대상으로 하는 C++ 프로그램 컴파일 항목의 설명에 따라 Visual Studio 개발 환경에서 이 파일을 컴파일할 수 있습니다.
-
소스 코드를 텍스트 편집기에 붙여넣고 확장명으로 .cpp를 사용하여 이를 저장한 다음 아래 설명에 따라 명령줄에서 이 파일을 컴파일할 수 있습니다.
-
코드 컴파일
예제 프로그램은 간단한 Visual C++ 콘솔 응용 프로그램이므로 아래 절차에서 설명하는 방법에 따라 명령줄에서 이를 컴파일하는 것이 더 쉽습니다.
클립보드에 복사한 코드 예제를 컴파일하려면
-
시작 단추를 클릭하고 모든 프로그램, Microsoft Visual Studio 2005, Visual Studio Tools를 차례로 가리킨 다음 Visual Studio 2005 명령 프롬프트를 클릭하여 Visual Studio 명령 프롬프트 창을 엽니다.
-
명령 프롬프트에 다음과 같이 입력하고 Enter 키를 누릅니다.
notepad timeelapsed.cpp
새 파일을 만들지 확인하는 메시지가 나타나면 예를 클릭합니다.
-
편집 메뉴에서 붙여넣기를 클릭하여 복사한 프로그램을 메모장에 추가합니다.
-
파일 메뉴에서 저장을 클릭합니다.
-
파일 메뉴에서 끝내기를 클릭하여 메모장을 종료합니다.
-
명령줄 프롬프트에 다음과 같이 입력하고 Enter 키를 누릅니다.
cl /clr timeelapsed.cpp
-
timeelapsed.exe 프로그램을 실행하려면 timeelapsed를 입력하고 Enter 키를 누릅니다.
프로그램이 실행되고 Windows를 마지막으로 시작한 이후 경과된 시간이 표시됩니다.
-
exit를 입력하고 Enter 키를 눌러 명령 프롬프트 창을 닫습니다.
참고 항목
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/69
- 댓글 남기기
[설계] 스토리 보드란?
스토리 보드란?
스토리보드 속에는 웹사이트의 전체적인 흐름과 더불어 텍스트와 이미지, 소리, 애니메이션 등의 데이타가 어떻게 조합되어 어떻게 보여지게 될 것인지의 세부적이고 구체적인 사항들이 모두 담기게 됩니다.
스토리보드는 정확하고 상세하여야 하며, 제대로된 스토리보드는 제대로된 웹사이트를 개발하기 위한 기본이라 할 수 있겠지요.
잘 되어있는 스토리보드란?
스토리보드가 완성되면, 디자이너는 스토리보드에 명시된 내용을 가지고, 화면 디자인부터 시작하여 각각의 일러스트 데이터를 그리게 됩니다.
프로그래머는 스토리보드를 보고 프로그램 및 DB설계를 하고 각 세부 로직을 프로그램 코딩하게 됩니다.
따라서 기획자는 스토리보드를 작성함에 있어 디자인컨셉, Web Style Guide 및 DB스키마, 프로세스로직에 대하여 꿰뚫고 그것을 응용할 수 있는 마인드가 필요합니다.
만일 스토리보드가 잘못되어 있거나 불충분하여 중간에 개념과 로직이 바뀌면 어떤 일이 벌어질까요? 그것은 말할 필요도 없이 프로그램과 그림 데이터가 그려진 것 만큼 손해를 입게 됩니다. 프로그램은 다시 작업을 하여야 하며, 그래픽 데이터는 사이즈와 내용이 맞지 않아 전혀 쓸모없는 것이 되어버리고 일정은 완전히 망가지게 되는것이죠.
대체로 기획자에 의해 스토리보드가 작성되어지면, 디자이너는 스토리보드를 보고 디자인을 하고,프로그래머는 스토리보드를 보고 프로그램을 설계하고 코딩하게 됩니다.
따라서 스토리보드가 잘못되면 잘못된 디자인, 잘못된 프로그램이 나올 수 있으며, 수정을 위해 위의 사항을 몆번이고 되풀이 해야되는 상황이 발생하여 상당한 시간과 노력을 더 들여야 하는 일이 발생하게 됩니다.
따라서 스토리보드를 작성한다는것 자체는 하나의 대형부터 소형, 미니형태까지의 기승전결에 의한 필요성과 분석을 충분히 거쳐서 진행이 되어야 합니다.
웹사이트 개발에 있어서 스토리보드는 개발의 설계도이며 작업 지침서라 할 수 있습니다.그러나 단순히 사이트의 페이지별로 UI나 항목등을 도식화 해서 페이징을 하여 내 놓은 스토리보드의 경우는 어떻게 보면 스토리보드라기보다는 개발 후의 완료산출물에 더 가깝다고 생각됩니다.
저의 경우는 항상 마스터플랜으로 생각을 하고 작성을 하고 있습니다.
마스터플랜이라는 말이 거창하게 들리겠지만 왜 스토리보드가필요한지, 기획단에서 분석하고 응용/개선해야할 필요성을 개념과 인식면에서 제일 중요하게 구분을 합니다.
이것은 디자이너와 프로그래머들이 스토리보드를 보며 충분히 이해 할 수 있도록 도와주며, 오히려 디자인적, 프로그램적으로 더욱 발전하여 반영해줄 여지를 줄 마음을 실어준다는것에 일반적인 스토리보드와 큰 차이를 가지고 있습니다.
스토리보드 형식 예제

<출처: http://blog.naver.com/dhnsn/10013995322>
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/67
- 댓글 남기기
[CVS] TortoiseCVS : Icon Overlays, UPDATE 이니셜 의미

UPDATE 시 약자의 의미

-
- C
-
The file has changed both in CVS and locally. TortoiseCVS attempted to merge both sets of changes into the local copy, but could not (probably because both changes were made to the same part of the file). For more information, see Resolving Conflicts.
- M
-
The file has only changed on the local PC. TortoiseCVS will not change the local copy.
- P
-
The file has changed in CVS, and TortoiseCVS has updated the local copy to match.
- U
-
The file exists in CVS, but not on the local machine. TortoiseCVS will create a copy on the local PC. You will also see this for files which have changed in CVS (as for P.
- A
-
The file has been added to CVS, but not yet committed.
- R
-
The file has been removed from CVS, but not yet committed.
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/66
- 댓글 남기기
[CVS] CvsNT on WinXP
CvsNT (Version: 2.5.03 Build 2382, WinXP)
인스톨 후 시작프로그램의 카테고리이다.

여기서 CVSNT Control Panel 을 이용해 환경설정한다. (도스창 열어 커맨드를 이용해도 된다)
① About 탭 페이지 Stop버튼으로 중지시킨다.
② Repository 및 Temporary 폴더를 지정한다. (필요에 따라 서버포트 같은것들도 바꿀 수 있다)
우선 로컬디스크에 Repository(CVS 자료 저장소)와 Temporary(CVS를 위한 임시 파일 저장소)로 사용할 디렉토리를 만들고 설정하자. Add할때 체크박스는 AllCheck 하였다<선택사항>


③ 환경설정후 Start 로 작동시키자.
④ 사용자를 추가한다. 커맨드를 사용하기 전 CVSROOT를 지정해준다.
> set CVSROOT = :sspi:127.0.0.1:3405:/Backup/CVSRep
> cvs passwd -r Administrator -a 추가할아이디

접속 테스트: 사용자 추가를 확인
> set cvsroot=:pserver:추가한아이디@127.0.0.1:포트:/Backup/CVSRep
> cvs login 추가한아이디 ☞ passwd를 묻고 로그인된다.
> cvs ls ☞ 현재 접속한CVS 저장소상에 존재하는 모듈 목록을 보여준다.
⑤ 사용자 권한 설정(admin 이냐 anonymous 이냣 그것이 문제로다!)
[Admin] : write/사용자 추가 삭제 등 가능
CVSROOT 디렉토리에 -확장자 없는- admin 파일을 만들고 아이디 목록을 적는다. (line by line)
[Anonymous] : read only
CVSROOT 디렉토리에 마찬가지로 readers 파일을 만들고 아이디 목록
위의 둘다 CVS Service 를 재시작 필요는 없단다.
<참고 CVS 커맨드 목록>

<참고>
♧ CVSNT 2.x 사용법 정리
♧ [심층분석] CVS FAQ ; command line
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/65
- 50 mg soma
-
-
live at soma
soma drug information
2010/08/12 09:45
- how to get a doctor to prescript soma
-
-
pill soma
no rx soma cod
2010/08/12 10:35
- cheap phizer soma
-
-
soma mandal
no prescription soma
2010/08/13 05:51
- soma overnight no rx
-
-
cod saturday soma
soma buy cod
2010/08/13 07:27
- soma retail discount
-
-
how to get soma prescription
soma soma generic
2010/08/13 07:36
- where to buy soma
-
-
where to buy soma
soma no script overnight
2010/08/13 07:40
- pill identification soma
-
-
order soma
iv iv sample soma
2010/08/13 07:55
- soma cod no script
-
-
soma without doctor rx
rx soma
2010/08/13 08:10
- valtrex cold sore prevention
-
-
valtrex in mexico
valtrex and vitamins
2010/08/13 10:21
- valtrex and dizziness
-
-
valtrex dose genital herpes
valtrex shortages
2010/08/13 11:48
- soma cash on delivery overnight
-
-
premature ejaculation soma
buy cheap soma without prescription
2010/08/13 11:50
- coupons rtg
-
-
slot game chip runner downloads
super jackpot party video game
2010/08/13 11:55
- valtrex news
-
-
valtrex coupons
valtrex and fertility
2010/08/13 12:00
- soma c.o.d. script
-
-
mark martin soma photo
buy soma with cod
2010/08/13 12:08
- get soma
-
-
overnight soma order
soma pill identification
2010/08/13 12:33
- drug female new soma
-
-
soma spa washington
soma heart attacks
2010/08/15 02:51
- generic valtrex
-
-
valtrex treatment
valtrex and pancreatitis
2010/08/15 02:58
- soma drugs
-
-
soma no a rxs needed cod
soma san diego
2010/08/15 03:03
- order valtrex online
-
-
valtrex other names
valtrex backorder
2010/08/15 03:08
- pill soma
-
-
online prescription soma without
50 mg soma
2010/08/15 03:14
- atenolol soma
-
-
soma screening test
buy soma online cheap
2010/08/15 03:26
- valtrex tablets
-
-
valtrex before surgery
valtrex lysine
2010/08/15 03:37
- valtrex and rash
-
-
valtrex and penicillin
valtrex prophylaxis dosage
2010/08/15 03:41
- effect side soma
-
-
safe soma woman
generic india soma
2010/08/16 05:05
- no deposit coupon full tilt
-
-
7free online slot
free slots online no download
2010/08/16 05:17
- soma c.o.d. script
-
-
soma fed ex
order soma cod overnight delivery
2010/08/16 06:13
- no dep scratchcards
-
-
play run on line
mega jack play no deposit
2010/08/16 06:18
- valtrex price cvs
-
-
can i take valtrex and lysine
valtrex for oral herpes
2010/08/16 06:25
- danger soma
-
-
buy soma online prescription
soma side effects
2010/08/16 06:27
- valtrex use during pregnancy
-
-
valtrex generic canada
valtrex prescription online
2010/08/16 06:32
- cost of valtrex without insurance
-
-
valtrex and abreva
valtrex ointment
2010/08/16 06:38
- valtrex and autism
-
-
valtrex 500mg side effects
generic valtrex fda
2010/08/16 06:40
- valtrex herpes simplex dosage
-
-
buy valtrex canada
valtrex cold sores treatment
2010/08/16 06:42
- valtrex versus famvir
-
-
valtrex for herpes zoster
valtrex treatment for cold sores
2010/08/17 12:03
- valtrex how long does it take to work
-
-
using valtrex while pregnant
no prescription valtrex
2010/08/17 12:28
- somafix
-
-
soma sf
soma without prescription mexico
2010/08/17 12:56
- free video slots with bonus no downloads play now
-
-
real vegas online coupon code
echophp coupon code
2010/08/17 13:03
- ordering soma online
-
-
how to buy soma online without a prescription
online shop soma
2010/08/17 13:06
- soma recordings
-
-
buy soma overnight fedex
25 mg soma
2010/08/17 13:19
- valtrex and pregnancy
-
-
valtrex buy
valtrex dose children
2010/08/17 13:24
- valtrex side effects weight gain
-
-
valtrex side effects weight gain
valtrex in pregnancy
2010/08/18 20:03
- valtrex valacyclovir hcl
-
-
valtrex headaches
valtrex and other medications
2010/08/18 20:08
- soma online no script
-
-
sheraton soma bay resort
no perscription soma
2010/08/18 20:15
- valtrex dosage for genital herpes outbreak
-
-
valtrex info
valtrex generic fda
2010/08/18 20:24
- free rx soma free shipping
-
-
soma smoothie es
cod order soma
2010/08/18 20:34
- valtrex information
-
-
valtrex generic date
valtrex 500mg caplets
2010/08/18 20:44
- valtrex off patent
-
-
valtrex transmission study
buy valtrex canada
2010/08/18 20:48
- discount soma online
-
-
generic somageneric soma
soma next day
2010/08/18 20:55
- valtrex cost
-
-
valtrex walmart
valtrex oral
2010/08/18 21:03
- taking valtrex while pregnant
-
-
gsk valtrex coupon
gsk valtrex coupon
2010/08/18 21:05
- valtrex for cold sores reviews
-
-
valtrex herpes prophylaxis
generic valtrex news
2010/08/18 21:24
- what is valtrex medication
-
-
valtrex in canada
valtrex and cold sores
2010/08/20 00:46
- soma no a rx drug
-
-
secret agent soma
generic soma.com
2010/08/20 00:48
- soma online without prescription
-
-
endometrium soma
soma overnight delivery fed ex
2010/08/20 01:12
- buy valtrex online canada
-
-
valtrex herpes suppression
herpes valtrex transmission
2010/08/20 01:25
- valtrex 500mg caplets
-
-
valtrex and renal failure
valtrex shortage
2010/08/20 01:40
- valtrex overnight
-
-
valtrex and benadryl
valtrex patent
2010/08/20 01:42
- no prescription cod soma
-
-
soma uk sales
soma overnight no prescription
2010/08/20 01:52
- carisoprodol 350mg soma
-
-
soma free consultation u.s. pharmacy
cheap somas
2010/08/20 02:10
- long term valtrex use
-
-
valtrex and ciprofloxacin
valtrex and ciprofloxacin
2010/08/20 02:12
- soma with overnight fedex
-
-
soma with overnight fedex
chico soma
2010/08/20 02:15
- soma online without prescription
-
-
compare soma to soma
soma overnight shipping no prescription
2010/08/20 02:20
- buy later now pay soma
-
-
soma on line no script
barbara book guest info order site soma
2010/08/20 03:04
- recent referers soma
-
-
how soma works
buy soma online overnight
2010/08/21 21:45
- buy soma without a prescription
-
-
cheap soma online without prescription
50 mg soma
2010/08/21 22:03
- betroyal 2010 no deposit codes
-
-
secret no deposit bingo bonus codes
secret no deposit bingo bonus codes
2010/08/21 22:26
- order soma to uk
-
-
from generic india soma
buy cheap soma no prescription
2010/08/21 22:28
- side effects valtrex
-
-
valtrex side effects rash
valtrex side effects rash
2010/08/21 22:33
- valtrex xr
-
-
valtrex for cold sores side effects
valtrex hsv keratitis
2010/08/21 22:45
- soma free pill
-
-
brand drug generic name soma
inexpensive soma
2010/08/21 22:56
- nondeposit betting bonus
-
-
rtg gambling sites
just for practice slots machine
2010/08/21 22:59
- valtrex herpes transmission
-
-
valtrex generic ranbaxy
can u take valtrex while pregnant
2010/08/23 10:20
- generic valtrex effectiveness
-
-
what is valtrex
valtrex 1 mg
2010/08/23 10:33
- valtrex cold sore reviews
-
-
valtrex generic canada
buy valtrex in canada
2010/08/23 11:10
- soma sale
-
-
isomalt dangers
secret agent soma
2010/08/23 11:15
- valtrex for shingles side effects
-
-
valtrex to prevent cold sores
valtrex no prescription
2010/08/23 11:18
- valtrex oral
-
-
valtrex cost cvs
valtrex prescription
2010/08/23 11:21
- 댓글 남기기
[JSP] Tomcat: 한글 문제
tomcat 5.0.16 (server)
--- READ
○mysql에서 select 시, 한글keyword에
MYSQLWebUtil.getKorToEn(
○resl.next();
zipcode = resl.getString(1);
sido = MYSQLWebUtil.getKorToEn(resl.getString(2));
--- WRITE
○query = MYSQLWebUtil.setWrite(MYSQLWebUtil.getTagFilter(query));
tomcat 4.1.3 (local)
--- WRITE
query = MYSQLWebUtil.setWrite(MYSQLWebUtil.getTagFilter(query));
--- READ
resl.next();
zipcode = resl.getString(1);
sido = MYSQLWebUtil.setWrite(resl.getString(2));
- 이 글의 트랙백 주소
- http://byhou.sshel.com/tc/byhou/trackback/64
- 댓글 남기기

















