디버그 모드로 프로그램을 작성해 컴파일한 후 실행하면 제대로 실행되는데, 릴리즈 모드로 컴파일한 후 실행하면 프로그램이 시작하기도 전에 죽어 버립니다. 디버그 모드에서는 결과값이 정상으로 나오는데, 릴리즈 모드에서 이런 현상이 발생하는 이유가 무엇일까요.
질문한 내용은 비주얼 C++의 경우 최적화 기능 때문에 발생하는 것입니다. 다음 소스를 보세요.
for(i=0; i<10; i++) {
j=3;
printf(“%d”, i);
}
별 문제 없는 소스지만 디버그 모드로 컴파일 할 때와 릴리즈로 컴파일 할 때 큰 차이를 보입니다. 디버그 모드일 때는 해당 소스를 그대로 컴파일하지만, 릴리즈 모드일 경우 최적화 옵션이 켜 있다면 소스가 다음과 같이 바뀝니다.
j=3;
for(i=0; i<10; i++) {
printf(“%d”, i);
}
앞의 소스에서 보다시피 j는 for문 내에 있을 필요가 없기 때문입니다. 속도만 느려지는 원인이 되기 때문에 최적화 기능에서 소스가 변하는 것입니다. 최적화 기능을 없애려면 다음과 같이 하세요. 프로젝트의 Settings을 선택한 후, C/C++ 탭을 선택하면 우측편에 Optimizations가 있습니다. 이것을 Disable(Debug)로 선택하면 됩니다. 참고로 릴리즈 모드로 컴파일하되 디버깅해 보는 방법을 알려 드리겠습니다. Win32 Release로 선택한 후 Settings에서 C/C++ 탭을 선택한 후 Debug info를 프로그램 데이터베이스로 선택합니다. 링크 탭에서 Generate debug info를 선택한 후 Rebuild All한 다음 디버그처럼 F10, F11키를 적절히 사용해 보세요. 디버깅을 할 수 있을 겁니다.
CString 객체가 \r을 많이 포함하고 있을 때, 즉 여러 줄로 구성돼 있을 때 한 줄씩 차례로 읽어 들이는 방법이 없나요? 을 찾은 후 거기까지 for loop 돌려서 getat으로 substring을 뽑고 그 substring 지우고…. 이런 식으로는 구현할 수 있겠는데 설마 코드를 이런 식으로까지 짜야 하는지요.
CString 객체에는 한 줄씩 읽어드리는 멤버가 없습니다. 다음과 같이 소스를 구성하기 바랍니다.
int nHead=0, nTail=0;
while (1) {
nTail = strData.Find(nHead, ‘’);
if (nTail == -1)
break;
strTemp = strData.Mid(nHead, nTail-nHead);
nHead = nTail + 2;
}
- this is the end of this file -
'IT_Programming > MFC · API' 카테고리의 다른 글
[MFC] 각 클래스별 설명 (0) | 2008.01.22 |
---|---|
콘솔 프로그램과 ODBC 연결 / keybd_event에서 한글문제 (0) | 2007.12.25 |
float형을 int로 빠르게 cast 하는 방법 / 문자열에서 코드종류 알아내기 (0) | 2007.12.25 |
2개의 툴바를 한줄에 / 현재 디렉토리의 정보를 알아내는 법 (0) | 2007.12.25 |
윈도우 접기 / 상태바에 그림 출력 / 시스템 강제로 다운시키기 (0) | 2007.12.25 |