블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
05-05 09:19

Notepad++배우기

Tip & Tech / 2011. 7. 30. 08:25

한글 웹에디터인 노트패드 로 HTML 편집을 할려고 합니다.

내려받기 사이트는

http://notepad-plus-plus.org/

입니다.

 

1.제일먼저 익스플로러에서 보려면 ctrl+alt+shift+I 입니다.

2.문장 뒷 공백 삭제: 긁어온 문장의 뒷 공백을 삭제할 때

편집 > 줄 끝 공백제거(TextFX > TextFx Edit > Trim Trailing Spaces)

2. merge: 여러 줄을 하나의 줄로 합친다.

합칠 줄 선택 > 편집 > 줄 합치기(Ctrl + J)

3.특정 구분자로 줄 나누기: 컴마(,) 혹은 | 와 같은 특정 구분자로 하나의 긴 문장을 여러 문장으로 분할함.

구분자를 clip board copy(Ctrl+C) > TextFX > TextFX Edit > Split lines at ...

4. 두개의 text 문서 비교하기: Diff

플러그인 > Compare > Compare . 작업 후 플러그인 > Compare > Clear Results

5.URI Encoding:

변환할 text 선택 > TextFX > TextFx Convert > Encode URI Component

6.컬럼 모드: row 가 아닌 column 작업을 할 때: 기존 드래그 동작에 alt 추가

Alt + 마우스 드래그 혹은 Alt + Shift + 커서 (Alt + C)

7.창 분할: 2개까지만 분할.

분할하기: 상단 문서명 tab 에 우클릭 > 분할 창으로 이동

분할 모드 변경(가로/세로): 분할 bar 에 우클릭 > Rotate to Right / Rotate to Left

8.정규식(Regular Expression) 사용하여 찾기/변환: Ctrl + H 단축키를 사용하여 창을 띄우고, 찾기방식 중 정규표현식을 선택

열려진 모든 파일에서 찾고 모두 바꾸기: 일일이 파일 찾아다니면서 할 필요 없이 열어놓은 상태에서 한번에 이 기능을 사용할 경우 작업 깔끔해짐.

정규식 사용: 꽤나 빡빡하게 적용한다. 전체 문자열 맨 뒤에 abc 를 추가로 붙이고 싶다면 ^(.*)$ \1abc 로 바꾸면 된다.

9.단축키

새파일 : Ctrl+N

빠른찾기(위로):ctrl + shift + ↑

빠른찾기(아래로): ctrl + shift + ↓

상위의 행과 바꾸기:ctrl + alt + ↑

하위의 행과 바꾸기:ctrl + alt + ↓

열기 : Ctrl+O

저장 : Ctrl+S

다른이름으로 저장 : Ctrl+Alt+S

모두 저장 : Ctrl+Shift+S

닫기 : Ctrl+W

인쇄 : Ctrl+P

종료 : Alt+F4

줄 나누기 : Ctrl+I

줄 합치기 : Ctrl+J

현재줄 위로 이동 : Ctrl+Shift+Up

현재줄 아래로 이동 : Ctrl+Shift+Down

열 편집기 : Alt+C

익스플로러에서보기 ctrl+alt+shift+i

기타단축키: 메뉴> 설정 > 단축키 설정

<응용>

1 Notepad++에서 URL 입력시 자동으로 하이퍼 링크가 생성이 되지 않게 하려면: 메뉴중 설정> 환경 설정> MISC 탭으로 이동을 합니다. 우측 상단에 클릭 가능한 링크 설정이라는 부분이 있는데, 여기에 사용에 체크가 되어 있습니다. 체크를 해제해 준 다음에 닫기 버튼을 클릭하고 URL을 입력하면 자동으로 링크가 생성이 되지 않고 일반 텍스트처럼 URL을 입력할 수 있슴

2. 아이콘을 숨길 수 있는 옵션(작업창 상단의 도구모음 아이콘이 화면에서 사라지고 기본 메뉴만표시): 메뉴에서 환경 설정> 도구모음>환경 설정 창의 전체 탭:도구 모음에 대한 옵션>숨기라는 부분앞에 체크> 닫기 버튼 응용

3.Notepad 정규표현식의 문법

일반 문자열의 매치와 변형까지 함께 찾음.

*참고로 백슬래시는 한글로 인코딩된 페이지에서는 \(원화표시)

^ : 행의 시작

^\d.+

[] : 포함된 문자들 중 하나와 매치하는 문자

[abc]= a, b, c 중의 한 글자

[a-z]와 같이 하이픈을 넣어서 범위 전체를 지정.

[0-9]라고 적으면 한 글자의 숫자를 뜻합니다.

[^abc] : []속에 들어간 ^표시는 이 대괄호에 포함된 글씨는 제외

S[^cde]m 이라는 정규식은 Sam, Sbm은 매치하지만 Scm, Sdm은 매치하지 않음

$ : 행의 끝

숫자로 끝나는 행: ^.+[0-9]$와 같이 표현

. : 마침표는 임의의 한 글자

+ :어떤 문자 뒤에 붙어서 해당하는 문자가 1개 이상, 여러 개

\d+라고 하면 1, 123141, 2513452345234등 길이에 무관하게 연속된 숫자를 찾습니다.

* : 문자 뒤에 붙어서 그 문자가 0개 이상(참고:+는 그 문자가 반드시 한번은 나옴)

sa+m sam, saam, saaaaaam에 매치, sm에는 매치되지 않듬. 하지만 sa*m sm에도 매치

\d : 한 글자의 숫자를 말합니다. (digit) [0-9]와 같습니다.

\w : 한 글자의 문자를 말합니다. [a-zA-Z]와 같습니다.

\s : 한 칸의 공백을 의미합니다.

\ : 백 슬래쉬는 이스케이프 문자 즉 ^, [, .과 같은 특수한 의미를 가지는 문자

\[abc\]: a,b,c 중의 한 글자가 아닌 [abc] 자체에 매치됩니다.

-이외 홈페이지(영문) 참고-

<예제>

콘솔박스를 통해 수집된 로그를 (어디서부터 받은 로그인지는 비밀) 토대로 메모리 사용량에 대한 정보를 추출

사실 콘솔 박스로부터 수집되는 정보는 상당히 다양하지만 메모리 정보를 담고 있는 부분은 아래와 같은 형식으로 되어 있습니다.

[21:44:07 Oct 12 Fri] @0x3924004E|JVM| Free Memory: Heap [ 2368340/ 6291456], Native[ 7299824/32505856]

우선 로그파일 전체를 notepad++로 불러들어와서 찾기(ctrl+F)를 실행

우리는 위와 같은행을 모두 찾아서 추출

통상 ‘Free Memory:’ 로 검색: 종종 중간에 정보가 끊어지고 2행에 걸쳐 깨진 채로 정보가 남음

-> heap native 정보를 모두 포함하고숫자]’로 끝나는 행

heap.+native.+\d]$

아래 스크린샷과 같이정규표현식에 체크를 해주고 위의 정규식을 입력한 다음, ‘열려진 파일에서 모두 찾기버튼을 클릭합니다. 버튼을 클릭하면 notepad++아래쪽으로 분할창이 생성되며 해당하는 행들이 모두 찾아집니다.

그럼 새 파일을 하나 만들고, 아래의 내용을 모두 선택(Ctrl+A)하여 새 파일에 붙여 넣습니다.

정규표현식의 패턴

‘Tom Smith’->“Smith, Tom”가 많을 때:

1.텍스트 파일을 엑셀로 불러들여서 공백으로 나누어 바꿈

2.패턴을 사용: 패턴이 되는 부분을 () 괄호로 묶은 다음, 바꿀 단어에서 \1, \2와 같이 나온 순서대로 써줌.

Line 394 : [21:44:07 Oct 12 Fri] @0x3924004E|JVM| Free Memory: Heap [ 2368340/ 6291456], Native[ 7299824/32505856]

위와 같은 로그 정보는 다음과 같이 풀이됩니다.

1.라인넘버가 표시됩니다.L로 시작됩니다.

2.타임스탬프는 [ 대괄호로 시작됩니다.

3.3쌍의 숫자가 콜론(:)으로 구분되어 시간을 표시합니다.

4.날짜와 요일이 표시되고 ]로 대괄호가 닫힙니다.

5.제거되어야할 문자열들이 이어지고

6.Heap 이라는 단어 다음에

7.[로 시작되며 남은 heap 메모리량과 슬래시(/)가 붙어 전체 heap 메모리량을 표시 * 숫자의 길이에 따라 공백이 있을 수 있슴

8.heap 메모리 정보는 ]로 끝나며 이후 native 메모리 정보가 같은 형식으로 표시

^L.+\[(\d\d:\d\d:\d\d).+\[([\s\d]+)/([\s\d]+)].+\[([\s\d]+)/([\s\d]+)]$

1. 괄호로 묶은 부분은 순서대로 (타임스탬프),(heap),(total heap),(native),(total native) 즉 순서대로 \1,\2,\3,\4,\5가 됨. 임의의 구분자 |(액셀에서 쉽게)를 사용->바꿀 단어는 \1|\2|\3|\4|\5

2. 찾을 단어와 바꿀 단어에 위에서 작성한 정규식을 넣어주고

3. 정규표현식에 체크한 상태에서모두바꾸기를 클릭

4. 필요한 정보만 남은 창

5. 텍스트 파일로 저장

6. |로 구분하여 셀을 분리

7. 깔끔하게 그래프를 그림.

 

<사용법으로 체계화된 한글매뉴얼은 아직 없는 것 같아

나름대로 정리해 보았습니다. 조금이라도 이해에 도음이 되었으면 합니다.>


출처 :  http://cafe.naver.com/iparkub/1325

반응형
Posted by blueasa
, |

셋업 프로젝트의 PostBuildEvent 나 PreBuildEvent 에서 배치 파일을 먼저 실행하고 나중에 다른 일들을 하려고 하면 배치 파일 이후의 작업들은 실행되지 않는 경우가 있다.

  1. "$(ProjectDir)test.bat" "$(BuiltOuputPath)"
    copy "$(BuiltOuputPath)" "$(ProjectDir)..\TestFolder\"

위의 경우 copy 명령이 실행되지 않는다.

이럴 경우에는 배치 파일 호출시 call 명령어로 호출해 주면 된다.

  1. call "$(ProjectDir)test.bat" "$(BuiltOuputPath)"
    copy "$(BuiltOuputPath)" "$(ProjectDir)..\TestFolder\"
반응형
Posted by blueasa
, |

환경변수 자동으로 추가하기

http://pragmaticstory.com/161

- 프로그램밍적으로 환경변수 등록하기
(환경변수/시스템변수 레지 위치)
Win7은 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment 을 사용해야 될듯 함.
http://prodev.springnote.com/pages/1948392

- 자바 환경변수 자동 등록 배치 파일
http://blog.naver.com/PostView.nhn?blogId=huilin21&logNo=90040087259



시스템 변수 자동 등록

Win7 - cmd 창에서 전역환경변수 설정하기(bat 파일로 만들면 됨)

 http://zextor.tistory.com/2670089
반응형
Posted by blueasa
, |

1. 디버깅 정보(.pdb 파일)가 현재 소스와 일치하지 않을 때.(소스가 수정 된 경우)
   - 리빌드 시도

2. VS2008 기준 [도구-옵션-디버깅-일반-소스 파일이 원래 버전과 정확하게 일치해야 함] 체크 해제 후, VS 재실행


반응형
Posted by blueasa
, |

Tortoise SVN 속도 향상 및 자동 업데이트

개발자에게 있어 SVN은 편리함과 안전성을 위해 꼭 필요한 툴이죠...
그런데 이렇게도 좋은 툴이,
컴퓨터에 나름의(?) 부하를 주지요.. ㅋㅋ
이런 부하를 조금이라도 줄이기 위해 여러 곳에서 수집한 방법들을 적어 봅니다.
아래 방법으로 저는 속도향상을 체감했습니다.


Tortose SVN 속도 향상

SVN 속도향상을 위해 아래 2가지 방법을 적용합니다.
1. 로그 캐싱 사용안함
사용자 삽입 이미지



SVN-설정-로그캐싱 탭에서 [로그 캐싱 사용] 체크 해제, [모호한 URL들을 허용합니다] 체크해제, [모호한 UUID를 허용합니다] 체크해제

2. 아이콘 오버레이 사용안함 (권장하지는 않음)
- 아이콘 갱신이 안됩니다.
사용자 삽입 이미지


오버레이 탭에서 [상태캐시]를 [없음]으로 선택
2) [제외경로]에 로컬디스크의 루트 경로들을 적어줌 (예 c:\* d:\*)
3) [포함경로]에 SVN 체크아웃 디렉토리 경로를 적어줌 (예 d:\SVN_Source\*)
- 경로가 여러개면 엔터치시고 경로를 더 적어주세요)

1~2 항목 수행 후에 작업관리자에서 TSVNCache.exe를 Kill 해주세요..



Tortoise SVN 자동 업데이트


1. 아무 디렉토리에다 batch 파일을 만듭니다.
예제로, d:\SVN_AutoUpdate.Bat로 텍스트 파일 형태로 만듭니다.

2. 파일의 내용으로는 아래와 같이 적어주세요
- SVN 설치 경로\bin\TortoiseProc.exe /command:update /path:"SVN 체크아웃폴더" /coseonend:자동으로 창 당기 의 형태입니다.
예) 한줄로 적어야 합니다.(한줄로 적으니 오른쪽 글자들이 짤려서.. 저는 줄을 나눴습니다... "exit"는 도스창을 닫기 위한 명령이므로.. 한줄 띄워주세)

"C:\Program Files\TortoiseSVN\bin\TortoiseProc.exe" /command:update /path:"d:\SVN_Source\"
/closeonend:1

exit



3. 파일 저장 후,
1) 시작-제어판-예약된 작업-[예약작업 추가] 실행
2) 창이 뜨면 [다음] 클릭 - [찾아보기]로 위에서 만든 bat 파일을 선택
3) 작업실행에 업데이트 주기를 선택 (저는 "매일"을 선택했습니다.) - [다음]클릭
4) 업데이트 할 시간을 적고 [다음]
5) 본인 컴퓨터의 암호 및 계정을 입력하고, [다음] 클릭
6) [마침]을 클릭하면 이 작업의 고급 속성 열기 체크 후 [마침] 클릭
7) 속성 창에서, 일정, 설정 등 원하는데로 설정 후 확인
8) 만들어진 예약작업에서 오른쪽 버튼-[실행]을 통해 정상 동작 하는지 확인 해봅니다.
9) 끝.

Written by 투덜이


반응형
Posted by blueasa
, |
1. download : http://code.google.com/p/syntaxhighlighter/

2. 설치 
 다운로드 받은 파일을 압축해제후 scripts, styles 폴더 안에 있는 파일들을 스킨-직접 올리기에서 모두 올린다.
 그런 후에 아래 내용을 스킨-html/css 에서 html 태그중 </body> 위에 아래 내용을 추가한다.
  1. <!-- Syntax Highlighter start -->  
  2. <link type="text/css" rel="stylesheet" href="./images/SyntaxHighlighter.css"></link>  
  3. <script language="javascript" src="./images/shCore.js"></script>  
  4. <script language="javascript" src="./images/shBrushCpp.js"></script>  
  5. <script language="javascript" src="./images/shBrushCSharp.js"></script>  
  6. <script language="javascript" src="./images/shBrushCss.js"></script>  
  7. <script language="javascript" src="./images/shBrushDelphi.js"></script>  
  8. <script language="javascript" src="./images/shBrushJava.js"></script>  
  9. <script language="javascript" src="./images/shBrushJScript.js"></script>  
  10. <script language="javascript" src="./images/shBrushPhp.js"></script>  
  11. <script language="javascript" src="./images/shBrushPython.js"></script>  
  12. <script language="javascript" src="./images/shBrushRuby.js"></script>  
  13. <script language="javascript" src="./images/shBrushSql.js"></script>  
  14. <script language="javascript" src="./images/shBrushVb.js"></script>  
  15. <script language="javascript" src="./images/shBrushXml.js"></script>  
  16. <script language="javascript">  
  17. dp.SyntaxHighlighter.ClipboardSwf = 'http://your_address/images/clipboard.swf';  
  18. dp.SyntaxHighlighter.HighlightAll('code');  
  19. </script>  
  20. <!-- Syntax Highlighter start -->  


3. 사용법

  1. tag중 pre와 textarea에 대한 : http://code.google.com/p/syntaxhighlighter/wiki/PreAndTextarea
  2. 사용법에 대한 : http://code.google.com/p/syntaxhighlighter/wiki/Usage
  3. 사용 가능한 언어 : http://code.google.com/p/syntaxhighlighter/wiki/Languages
  4. 설정 : http://code.google.com/p/syntaxhighlighter/wiki/Configuration



    출처 : 
    http://srand.tistory.com/8 



Usage

Placing the code

Place your code on the page and surround it with <pre> tag. Set name attribute to code and class attribute to one of the language aliases you wish to use.

<pre name="code" class="c-sharp">
... some code here ...
</pre>

NOTE: One important thing to watch out for is opening triangular bracket <. It must be replaced with an HTML equivalent of &lt; in all cases. Failure to do won't break the page, but might break the source code displayed.

An alternative to <pre> is to use <textarea> tag. There are no problems with < character in that case. The main problem is that it doesn't look as good as <pre> tag if for some reason JavaScript didn't work (in RSS feed for example).

<textarea name="code" class="c#" cols="60" rows="10">
... some code here ...
</textarea>

Extended configuration

There's a way to pass a few configuration options to the code block. It's done via colon separated arguments.

<pre name="code" class="html:collapse">
... some code here ...
</pre>

Making it work

Finally, to get the whole thing to render properly on the page, you have to add JavaScript to the page.

<link type="text/css" rel="stylesheet" href="css/SyntaxHighlighter.css"></link>
<script language="javascript" src="js/shCore.js"></script>
<script language="javascript" src="js/shBrushCSharp.js"></script>
<script language="javascript" src="js/shBrushXml.js"></script>
<script language="javascript">
dp
.SyntaxHighlighter.ClipboardSwf = '/flash/clipboard.swf';
dp
.SyntaxHighlighter.HighlightAll('code');
</script>

For optimal result, place this code at the very end of your page. Check HighlightAll for more details about the function.

반응형
Posted by blueasa
, |
@err,hr

VS 로 디버깅할때 watch 창에 저렇게 적어주면 GetLastError() 값이 에러 문자열로 변경되어 화면에 출력됩니다. 
편하죠 ^^

반응형
Posted by blueasa
, |
링크 : http://forums.andromedarabbit.net/wiki/%EC%9C%88%EB%8F%84%EC%9A%B0_%EC%95%88%EC%A0%84%ED%95%9C_%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

런타임 검사

[편집]개요

런타임 검사는 Runtime Check, RTC라고 한다. Visual Studio 2008을 기준으로 보면 [프로젝트 - 속성 - 구성 속성 - C/C++ - 코드 생성] 메뉴에 관련 옵션이 있다. 작은 형식 검사 (/RTCc), 기본 런타임 검사 (/RTC1, /RTCsu)가 런타임 검사에 속한다.

  • /RTCc

더 큰 데이터 형식의 값을 더 작은 데이터 형식에 할당할 때 데이터 손실이 발생할 수 있음을 결고한다. 예를 들어 INT64 변수 값을 INT32 변수에 할당하는 경우가 이에 해당한다. 물론 이러한 할당이 의도적이고 정확한 연산일 수도 있기 때문에 아무 때나 오류 메시지를 내보내진 않는다. 값 할당 시에 비트 연산자를 명시적으로 사용하면 RTCc 검사에 걸리지 않는다.

#include <crtdbg.h>
 
char get8bits(int value, int position) {
   _ASSERT(position < 32);
   return (char)(value >> position);
   // Try the following line instead:
   // return (char)((value >> position) && 0xff);
}
 
int main() {
   get8bits(12341235,3);
}
  • /RTCs

스택 프레임 런타임 오류 검사를 수행한다. MSDN 라이브러리 문서를 읽고 어떤 식으로 문제를 탐지해내는지 알아두면 커스텀 스택 메모리 할당자를 개발할 때 도움이 된다. Earlgrey 프로젝트의 StackAllocator는 이러한 사례 중 하나이다.

  • /RTCu

초기화되지 않은 변수가 사용될 때 보고한다.

  • /RTC1, /RTCsu

/RTC1은 /RTCsu를 뜻한다.


[편집]언제 쓰는가?

/RTC 옵션은 컴파일러가 탐지 기능을 삽입해 넣으므로 성능에 영향을 미친다. 더군다나 /RTC 옵션이 설정되면 최적화(optimize pragma, /O)도 되지 않는다. 그러므로 DEBUG 빌드 때에만 /RTC 옵션을 켜는 게 좋다.

[편집]boost::numeric_cast 와 /RTCc

/RTCc 옵션을 켠 상태로 boost::numeric_cast를 쓰다 보면 런타임 오류 메시지를 마주치게 된다.

TEST(EarlgreyMathTest, UIntToInt64)
{
	EARLGREY_STATIC_ASSERT(UINT_MAX < _I64_MAX);
 
	UINT src = 123;
	INT64 dst = EARLGREY_NUMERIC_CAST<INT64>(src);
	ASSERT_EQ(123, dst);
}

boost::numeric_cast 내부에서 비트 연산을 명시적으로 써서 컴파일러가 올바른 타입 변환임을 알게 해주었더라면 이런 문제가 없었을 것이다. 이 문제를 해결하려면 크게 두 가지 방법이 동원 가능하다.

  • boost::numeric_cast의 소스 코드를 고친다. 물론 써드파티 라이브러리를 손 대기 시작하면 이후에 최신 버전으로 업그레이드할 때 골이 아프다.
  • #pragma runtime_checks 지시자를 활용한다. 이 지시자를 사용하면 일부 함수에 한해 특정 런타임 검사를 무효화할 수 있다. 일반적으로 이 지시자로 문제 해결이 가능하지만 안타깝게도 boost::numeric_cast처럼 템플릿 함수일 때는 그렇게 상황이 단순하지 않다. 다양한 이슈가 있기 때문에 뒤에서 따로 이 문제를 다룬다. 여기선 /RTCc 옵션틀 끄는 편이 나을 수도 있다는 것만 언급한다.

[편집]/RTCc 와 #pragme runtime_checks

 
반응형
Posted by blueasa
, |


종종 프로젝트 설정을 잘 못 만지면 pre compiled header 에 대한 오류를 볼 수 있습니다. (나만 그런가?)
그냥 pre compiled header 를 사용안함으로 해버리면 해결 됩니다.

그러나 이건 근본적인 해결책은 되지 못하겠지요. 또한 pre compiled header 를 사용하는 이점을 모두 버려야 하구요 :-)


pre compiled header 옵션이 몇가지가 있는데 모두 어떻게 동작하는지 정확히는 알지 못하겠습니다. 
아무튼 난 기본 설정(미리 컴파일된 헤더 파일 사용)을 쓰고 싶단 말입니다 !!

자 ~ 원래 기본 설정(/Yu) 로 바꿔두고요..빌드를 해봅시다. 
당연히 미리 컴파일된 헤더를 찾을수 없다고 떠들어 대는 컴파일러 메세지를 볼 수 있을것입니다.


이는 "미리 컴파일된 헤더" 로 지정된 stdafx.h 때문에 그렇습니다. 
stdafx.cpp통해서 pch 파일을 생성하고, 나머지는 모두 만들어진 pch 를 통해서 컴파일이 됩니다. 
어디선가 pch 파일을 무턱대고 복사해놓고, 빌드를 하면 일치하지 않는다는 등의 또 다른 컴파일러의 불만을 보게 되겠지요. 


stdafx.cpp 의 속성을 위와 같이 미리 컴파일된 헤더 생성(/Yc) 로 두면 문제는 해결됩니다. 

stdafx.cpp 를 통해서 pch 를 만들고, 나머지 파일들은 pch 를 이용, 즉 설정 이름처럼 미리 컴파일된 헤더 사용이니까요. 결국 stdafx.cpp 는 미리 컴파일된 헤더를 만들어야 겠죠.. 

종종..이 문제때문에 프로젝트를 새로 생성했던 기억이 있어서.. 좀 뒤적거리다가 알아냈습니다. 


출처 :  
http://somma.egloos.com/2723641
반응형
Posted by blueasa
, |



참고 : 
http://cafe.naver.com/jzsdn/310  : 형변환 (float -> int)
http://cafe.naver.com/jzsdn/8571 : Fast sqrt 테스트..
http://cafe.naver.com/jzsdn/11236 : Intel FPU Rounding mode
 
 
참고내용을 토대로 정리를 조금 해보았습니다.
 
우선 형변환(float -> int)부터 적어 봅니다. 우선 결과입니다.

 

 

방법1) FPU를 이용한 인라인 어셈코드입니다.

 

int fastf2i_round(float f)
{
#ifdef _WIN32
 int i;
 __asm
 {
  fld  f
  fistp i
 }
 return i;
#else
 return (int)(f + 0.5f);
#endif 
}

 

장점 : 가장 빠릅니다.

단점 : 반올림이 됩니다. 따라서 int a = int(1234.56f) 와 같은 값이 안 나온다는 것입니다. 반올림되어서 1235가 나옵니다.

 

방법2) 역시 FPU를 이용한 인라인 어셈코드이지만 반올림을 안하도록 약간의 조정을 합니다.

 

int fastf2i(float fValue)
{
#ifdef _WIN32
 static const float round_to_nearest = -0.499999f;

    int iValue;
    __asm 
 {
  fld  fValue
  fadd round_to_nearest
  fistp iValue
 }
    return iValue;
#else
    return (int)fValue;
#endif
}


장점 : 역시 방법1과 흡사하게 빠릅니다.

단점 : 방법1에서 반올림이 안되도록 반올림값을 빼주고 있습니다만 0.9999999f식의 값이 들어오면 역시 반올림됩니다. 물론 round_to_nearest 를 약간 상황에 맞게 수정하면 되는 것입니다만 약간 찝찝한 것 사실입니다.

 

 

방법3) int변환을 그대로 인라인 어셈화 하였습니다.

 

int Float2Int( float a )
{
#ifdef _WIN32
 int CtrlwdHolder;
 int CtrlwdSetter;
 int RetVal;
 __asm 
 {
  fld    a     // push 'a' onto the FP stack
  fnstcw CtrlwdHolder   // store FPU control word
  movzx  eax, CtrlwdHolder // move and zero extend word into eax
  and    eax, 0xFFFFF3FF  // set all bits except rounding bits to 1
  or     eax, 0x00000C00  // set rounding mode bits to round down
  mov    CtrlwdSetter, eax // Prepare to set the rounding mode -- prepare to enter plaid!
  fldcw  CtrlwdSetter   // Entering plaid!
  fistp  RetVal    // Store and converted (to int) result
  fldcw  CtrlwdHolder   // Restore control word
 }
 return RetVal;
#else
 return (int)a;
#endif 
}

 

장점 : 일반 int형변환과 정확히 일치합니다.

단점 : 그다지 많이 빠르지 않네요.

 

방법4) Game Programming Gems2 chapter 2.1에 Yossarian King씨가 작성한 방법입니다.

 

typedef union
{
    int     i;          // as integer
    float   f;          // as float
    struct              // as bit fields
    {
        unsigned int    sign:1;
        unsigned int    biasedexponent:8;
        unsigned int    significand;
    } bits;
} INTORFLOAT;


INTORFLOAT  FTOIBIAS = {((23 - 0 + 127) << 23) + (1 << 22)};

 

int f2i(float f) 
{
 INTORFLOAT ftmp;
 ftmp.f = f;
 ftmp.f += FTOIBIAS.f;
 ftmp.i -= FTOIBIAS.i;
 return ftmp.i; 
}

 

장점 : FPU모드에 따라 일반적으로 일반 int형변환과 정확히 일치합니다.

단점 : float의 값이 2의 23승(8388608)보다 작아야 합니다. 또한, FPU모드가 Chopping이 아닌 경우. 예를 들면 위의 fastf2i_round나 fastf2i와 같이 사용하면 안됩니다. fastf2i_round나 fastf2i는 FPU모드를 반올림모드로 사용하는데, f2i함수는 FPU모드를 따로 설정하지 않기 때문에 현재 FPU모드 그대로 변환을 시도합니다. (FPU모드는 위의 참고를 보시기 바랍니다)

 

결론) 복잡하시죠? ^^

반올림이 상관없을 때는 fastf2i_round를 사용하세요.

일반 int형변환과 같이 같은 값이 나오기를 바라신다면 fastf2i나 Float2Int를 사용하세요.


출처 :  http://cafe.naver.com/jzsdn/11238

반응형
Posted by blueasa
, |