에러를 만났을 때.

.... 본문 생략....

코딩을 하다가 뭔가 예상하지 못한 에러를 만났습니다. 그럴 때 우리는 즉각적으로

‘어? 이상하다’하고 생각하면서 그냥 다시 코드를 돌려봅니다.

같은 결과이면 심증적으로 범인을 하나 지목하고는 약간 고친 다음 다시 돌려봅니다.

이런 작업을 반복하면서 머리는 더욱 열이 나고 마음은 점점 복잡해집니다.


이럴 때 다음 방법을 한 번 실험해 볼 것을 권합니다. 예상 못한 에러가 나면 즉시 키보드에서 손을 뗍니다.

그리고 '지금 도대체 무슨 일이 벌어지고 있는 거지?'라고 스스로 질문을 합니다. 눈을 크게 뜨고 현재 상황을

최대한 명료하게 파악하려고 합니다. 정보를 수집하는 데에 우선 집중합니다. 에러 메시지를 차분하게 읽습니다.

몇 번째 줄, 어떤 코드에서 에러가 난 것인지, 어떤 종류의 에러인지 차분히 글자 하나 빼놓지 않고 봅니다.

싯구를 암송하듯이 소리내어 읽어도 좋습니다. 그리고는 눈을 감습니다. 마음 속에서 코드를 탐색합니다.

어느 부분에서 잘못되었지? 거기는 무슨 일을 하는 코드지? 문제의 원인은 어디에 있을까?

그 다음 눈을 뜨고 실제 코드를 찾아봅니다. 자신의 생각과 같은지 확인합니다.

이 방법을 좀 더 확장해 적용할 수 있는데,

자세한 설명은 『테스트 주도 개발』 재출간판 역자서문에 써두었으니 참고하세요. ....

Posted by 혁쌈

2008/10/22 17:21 2008/10/22 17:21
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/414

비트맵 고급 - DIB / DIBtoDDB

* DIB


1. DIB 파일 읽기

2. DIB를 DDB로 변환

3. 메모리 DC를 활용


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


1. DIB 의 구조


다양한 장치에 사용할 수있도록 하기 위해서 비트맵 출력에 대한 상세 정보를 포함하고 있다.


[ DIB 구조 ]

BITMAPFILEHEADER 구조체

BITMAPINFOHEADER 구조체

RGBQUAD 구조체 배열

비트 정보   => 실제 데이타의 비트 정보가 들어 있다.


1) BITMAPFILEHEADER 구조체




typedef struct tagBITMAPFILEHEADER {
       WORD    bfType;                        // 파일의 형태 : BM
       DWORD   bfSize;                        / 비트맵 파일의 크기를 바이트 단위로

       WORD    bfReserved1;
       WORD    bfReserved2;
       DWORD   bfOffBits;                     // 실제 데이타의 위치 ( 헤더의 전체 크기)
} BITMAPFILEHEADER, FAR *LPBITMAPFILEHEADER, *PBITMAPFILEHEADER;



2) BITMAPINFOHEADER 구조체



typedef struct tagBITMAPINFOHEADER{
       DWORD      biSize;                   // 구조체 크기
       LONG       biWidth;                 // 가로 픽셀수
       LONG       biHeight;               // 세로 픽셀수
       WORD       biPlanes;              // 플레인 갯수
       WORD       biBitCount;     // 한 픽셀이 몇개의 비트로 이루어 지나 4= 16 /  8 = 256
       DWORD      biCompression;    // 압축 방법 지정  

 BI_RGB : 비압축 BI_RLE8 : 8비트 압축 BI_RLE4 : 4비트 압축
       DWORD      biSizeImage;           // 이미지의 크기를 바이트단위로   BI_RGB에서는 0
       LONG       biXPelsPerMeter;        // 가로 해상도
       LONG       biYPelsPerMeter;        // 세로 해상도
       DWORD      biClrUsed;               // 색상테이블의 실제 사용 색상수 :

0이면 모두나 아니면 이크기가 RGB의 크기
       DWORD      biClrImportant;         // 비트맵 출력의 필수적인 색상수 :

0이면 모두다
} BITMAPINFOHEADER, FAR *LPBITMAPINFOHEADER, *PBITMAPINFOHEADER;



3) RGBQUAD 구조체 배열 => 일종의 팔레트


16색상의 비트맵이면 16개의 팔레트를 가진다. 256색이면 256 개의 팔레트 항목을 가진다.



typedef struct tagRGBQUAD {
       BYTE    rgbBlue;
       BYTE    rgbGreen;
       BYTE    rgbRed;
       BYTE    rgbReserved;
} RGBQUAD;



[TIP ] BITMAPINFO 하나로 헤더와 팔레트를 관리 한다.

typedef struct tagBITMAPINFO {
   BITMAPINFOHEADER    bmiHeader;
   RGBQUAD             bmiColors[1];
} BITMAPINFO

4) 비트맵 파일을 열어서 16진수 파일을 살펴 보자 


-------------------------------------------------------------------------------------------------


2 . DIB 출력


파일을 읽어서 BMP 파일을 출력


1) 출력 함수

  => DDB 에 출력함수 내부적으로 포맽 변환을 하므로 속도가 느리다.


int SetDIBitsToDevice(
  HDC
hdc,                 // handle to DC
  int XDest,               // x-coord of destination upper-left corner
  int YDest,               // y-coord of destination upper-left corner

  DWORD dwWidth,           // source rectangle width
  DWORD dwHeight,          // source rectangle height
  int XSrc,                // x-coord of source lower-left corner
  int YSrc,                // y-coord of source lower-left corner
  UINT uStartScan,         // first scan line in array
  UINT cScanLines,         // number of scan lines
  CONST VOID *lpvBits,     // array of DIB bits
  CONST BITMAPINFO *lpbmi, // bitmap information
  UINT fuColorUse          // RGB or palette indexes
);

예)


SetDIBitsToDevice(hdc,0,0,bx,by,

                            0,0,

                            0,by

                           ,pRaster,(BITMAPINFO *)ih,DIB_RGB_COLORS);




예)  DIB 이미지 출력


BITMAPFILEHEADER *fh=NULL;
BITMAPINFOHEADER *ih;
int bx,by;
BYTE *pRaster;


void LoadDIB(char *Path)
{
HANDLE hFile;
DWORD FileSize, dwRead;

hFile=CreateFile(Path,GENERIC_READ,0,NULL,
 OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
if (hFile==INVALID_HANDLE_VALUE) {
 return;
}

FileSize=GetFileSize(hFile,NULL);

if (fh)
 free(fh);


// 헤더 정보 읽기
fh=(BITMAPFILEHEADER *)malloc(FileSize); // 메모리 할당
ReadFile(hFile,fh,FileSize,&dwRead,NULL);
CloseHandle(hFile);


   // 데이타의 위치
pRaster=(PBYTE)fh+fh->bfOffBits;


// 비트맵 info
ih=(BITMAPINFOHEADER *)((PBYTE)fh+sizeof(BITMAPFILEHEADER));

// 이미지 폭과 넓이
bx=ih->biWidth;
by=ih->biHeight;
}

case WM_PAINT:
 hdc=BeginPaint(hWnd, &ps);
 if (fh) {
  SetDIBitsToDevice(hdc,0,0,bx,by,0,0,0,by,pRaster,(BITMAPINFO *)ih,DIB_RGB_COLORS);
   }
 EndPaint(hWnd, &ps);
 return 0;





2) 확대 함수 : dib 확대 함수 이다.


int StretchDIBits(
  HDC
hdc,                      // handle to DC
  int XDest,                    // x-coord of destination upper-left corner
  int YDest,                    // y-coord of destination upper-left corner
  int nDestWidth,               // width of destination rectangle
  int nDestHeight,              // height of destination rectangle
  int XSrc,                     // x-coord of source upper-left corner
  int YSrc,                     // y-coord of source upper-left corner
  int nSrcWidth,                // width of source rectangle
  int nSrcHeight,               // height of source rectangle
  CONST VOID *lpBits,           // bitmap bits
  CONST BITMAPINFO *lpBitsInfo, // bitmap data
  UINT iUsage,                  // usage options
  DWORD dwRop                   // raster operation code
);


---------------------------------------------------------------------------------------------------------


3. DIB 속도 개선을 위한 변경


1) 접근법

화면과 호환되는 DDB 로 바꾸어 놓고 이 후 출력에는 BitBlt로 사용하는것이 훨씬더 유리하다.


2) 변환의 과정


DIB와 같은 크기를 가지는 호환 메모리 DC를 생성  => 이 DC에 호환 비트맵(DDB)를 선택해 놓고 => DIB를 출력



3) 변환 함수 (DIB->DDB)


HBITMAP CreateDIBitmap(
  HDC
hdc,                                               // handle to DC
  CONST BITMAPINFOHEADER *lpbmih,          // bitmap data
  DWORD fdwInit,                                        // initialization option
  CONST VOID *lpbInit,                                 // initialization data
  CONST BITMAPINFO *lpbmi,                        // color-format data
  UINT fuUsage                                            // color-data usage
);


예)

BITMAP bit;

hBit=CreateDIBitmap(hdc,(BITMAPINFOHEADER *)ih,CBM_INIT,

  (PBYTE)fh+fh->bfOffBits,

(BITMAPINFO)ih,DIB_RGB_COLORS);                                   

DrawBitmap(hdc,0,0,hBit);  



---------------------------------------------------------------------------------------------------------


4. 비트맵의 활용


1) 가상 화면 (offscreen BItmap)

dc 와 호환 되는 메모리 DC를 만들고 메모리 DC에 비트맵을 선택하면 이 메모리 DC가 가상 화면이 된다.

가상화면에 모든 그래픽적인 출력이 가능하다. 이때 출력은 화면이 아니라 가상화면에 그려진다.

=> 더블 버퍼링을 이용 화면의 깜빡임이 줄어든다.


예)


// 전역 변수
HBITMAP MemBit;   // 가상 메모리 비트맵


// 메모리 비트맵을 만들고 메모리 DC에 선택한다.
MemBit=CreateCompatibleBitmap(hdc, 600,400);
MemDC=CreateCompatibleDC(hdc);
hOldBmp=(HBITMAP)SelectObject(MemDC, MemBit);

  -------- 그리는 작업 -------------




// MemBit 비트맵을 화면으로 출력한다.
case WM_PAINT:
   hdc=BeginPaint(hWnd, &ps);


     MemDC=CreateCompatibleDC(hdc);
     hOldBmp=(HBITMAP)SelectObject(MemDC, MemBit);


      BitBlt(hdc, 0,0,600,400,MemDC,0,0,SRCCOPY);
     SelectObject(MemDC, hOldBmp);
      DeleteDC(MemDC);
      EndPaint(hWnd, &ps);
      return 0;


Posted by 혁쌈

2007/05/26 16:59 2007/05/26 16:59
,
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/277

8086 어셈블리 명령어

 

명  령  어

설                                    명

Data Transfer

PUSH

Push

오퍼랜드의 내용을 스택에 쌓는다

POP

Pop

스택으로부터 값을 뽑아낸다.

XCHG

Exchange Register/
memory with Register

첫 번째 오퍼랜드와 두 번째 오퍼랜드 교환

IN

Input from AL/AX to Fixed port

오퍼랜드로 지시된 포트로부터 AX에 데이터 입력

OUT

Output from AL/AX to Fixed port

오퍼랜드가 지시한 포트로 AX의 데이터 출력

XLAT

Translate byte to AL

BX:AL이 지시한 데이블의 내용을 AL로 로드

LEA

Load Effective Address to Register

메모리의 오프셋값을 레지스터로 로드

LDS

Load Pointer to DS

REG←(MEM), DS←(MEM+2)

LES

Load Pointer ti ES

REG←(MEM), ES←(MEM+2)

LAHF

Load AH with Flags

플래그의 내용을 AH의 특정 비트로 로드

SAHF

Store AH into Flags

AH의 특정 비트가 플래그 레지스터로 전송

PUSHF

Push Flags

플래그 레지스터의 내용을 스택에 쌓음

POPF

Pop Flags

스택으로부터 플래그 레지스터로 뽑음

Arithmetic

ADD

Add

캐리를 포함하지 않은 덧셈

SBB

Subtract with Borrow

캐리를 포함한 뺄셈

DEC

Decrement

오퍼랜드 내용을 1 감소

NEG

Change Sign

오퍼랜드의 2의 보수, 즉 부호 반전

CMP

Compare

두 개의 오퍼랜드를 비교한다

ADC

Add with Carry

캐리를 포함한 덧셈

INC

Increment

오퍼랜드 내용을 1 증가

AAA

ASCII adjust for Add

덧셈 결과 AL값을 UNPACK 10진수로 보정

DAA

Decimal adjust for Add

덧셈 결과의 AL값을 PACK 10진수로 보정

SUB

Subtract

캐리를 포함하지 않은 뺄셈

AAS

ASCII adjust for Subtract

뺄셈 결과 AL값을 UNPACK 10진수로 보정

DAS

Decimal adjust for Subtract

뺄셈 결과의 AL값을 PACK 10진수로 보정

MUL

Multiply (Unsigned)

AX와 오퍼랜드를 곱셈하여 결과를 AX 또는 DX:AX에 저장

IMUL

Integer Multiply (Signed)

부호화된 곱셈

AAM

ASCII adjust for Multiply

곱셈 결과 AX값을 UNPACK 10진수로 보정

DIV

Divide (Unsigned)

AX 또는 DX:AX 내용을 오퍼랜드로 나눔. 몫은 AL, AX 나머지는 AH, DX로 저장

IDIV

Integer Divide (Signed)

부호화된 나눗셈

AAD

ASCII adjust for Divide

나눗셈 결과 AX값을 UNPACK 10진수로 보정

CBW

Convert byte to word

AL의 바이트 데이터를 부호 비트를 포함하여 AX 워드로 확장

CWD

Convert word to double word

AX의 워드 데이터를 부호를 포함하여 DX:AX의 더블 워드로 변환

Logic

NOT

Invert

오퍼랜드의 1의 보수, 즉 비트 반전

SHL/SAL

Shift logical / arithmetic Left

왼쪽으로 오퍼랜드만큼 자리 이동 (최하위 비트는 0)

SHR

Shift logical Right

오른쪽으로 오퍼랜드만큼 자리 이동 (최상위 비트 0)

SAR

Shift arithmetic Right

오른쪽 자리이동, 최상위 비트는 유지

ROL

Rotate Left

왼쪽으로 오퍼랜드만큼 회전 이동

ROR

Rotate Right

오른쪽으로 오퍼랜드만큼 회전 이동

RCL

Rotate through Carry Left

캐리를 포함하여 왼쪽으로 오퍼랜드만큼 회전 이동

RCR

Rotate through Carry Right

캐리를 포함하여 오른쪽으로 오퍼랜드만큼 회전 이동

AND

And

논리 AND

TEST

And function to Flags, no result

첫 번째 오퍼랜드와 두 번째 오퍼랜드를 AND하여 그 결과로 플래그 세트

OR

Or

논리 OR

XOR

Exclusive Or

배타 논리 합 (OR)

String Manipulation

REP

Repeat

REP 뒤에 오는 스트링 명령을 CX가 0이 될 때까지 반복

MOVS

Move String

DS:SI가 지시한 메모리 데이터를 ES:DI가지시한 메모리로 전송

CMPS

Compare String

DS:SI와 ES:DI의 내용을 비교하고 결과에 따라 플래그 설정

SCAS

Scan String

AL 또는 AX와 ES:DI가 지시한 메모리 내용 비교하고 결과에 따라 플래그 설정

LODS

Load String

SI 내용을 AL 또는 AX로 로드

STOS

Store String

AL 또는 AX를 ES:DI가 지시하는 메모리에 저장

Control Transfer

CALL

Call

프로시저 호출

JMP

Unconditional Jump

무조건 분기

RET

Return from CALL

CALL로 스택에 PUSH된 주소로 복귀

JE/JZ

Jump on Equal / Zero

결과가 0이면 분기

JL/JNGE

Jump on Less /
not Greater or Equal

결과가 작으면 분기 (부호화된 수)

JB/JNAE

Jump on Below /
not Above or Equal

결과가 작으면 분기 (부호화 안 된 수)

JBE/JNA

Jump on Below or Equal /
not Above

결과가 작거나 같으면 분기 (부호화 안 된 수)

JP/JPE

Jump on Parity / Parity Even

패리티 플레그가 1이면 분기

JO

Jump on Overflow

오버플로가 발생하면 분기

JS

Jump on Sign

부호 플레그가 1이면 분기

JNE/JNZ

Jump on not Equal / not Zero

결과가 0이 아니면 분기

JNL/JGE

Jump on not Less /
Greater or Equal

결과가 크거나 같으면 분기 (부호화된 수)

JNLE/JG

Jump on not Less or Equal /
Greater

결과가 크면 분기 (부호화된 수)

JNB/JAE

Jump on not Below /
Above or Equal

결과가 크거나 같으면 분기 (부호화 안 된 수)

JNBE/JA

Jump on not Below or Equal /
Above

결과가 크면 분기 (부호화 안 된 수)

JNP/JPO

Jump on not Parity / Parity odd

패리티 플레그가 0이면 분기

JNO

Jump on not Overflow

오버플로우가 아닌 경우 분기

JNS

Jump on not Sign

부호 플레그가 0이면 분기

LOOP

Loop CX times

CX를 1감소하면서 0이 될 때까지 지정된 라벨로 분기

LOOPZ/
LOOPE

Loop while Zero / Equal

제로 플레그가 1이고 CX≠0이면 지정된 라벨로 분기

LOOPNZ/
LOOPNE

Loop while not Zero / not Equal

제로 플레그가 0이고 CX≠0이면 지정된 라벨로 분기

JCXZ

Jump on CX Zero

CX가 0이면 분기

INT

Interrupt

인터럽트 실행

INTO

Interrupt on Overflow

오버플로우가 발생하면 인터럽트 실행

IRET

Interrupt Return

인터럽트 복귀 (리턴)

Processor Control

CLC

Clear Carry

캐리 플레그 클리어

CMC

Complement Carry

캐리 플레그를 반전

CLD

Clear Direction

디렉션 플레그를 클리어

CLI

Clear Interrupt

인터럽트 플레그를 클리어

HLT

Halt

정지

LOCK

Bus Lock prefix

STC

Set Carry

캐리 플레그 셋

NOP

No operation

STD

Set Direction

디렉션 플레그 셋

STI

Set Interrupt

인터럽트 인에이블 플레그 셋

WAIT

Wait

프로세서를 일지 정지 상태로 한다

ESC

Escape to External device

이스케이프 명령


지시어

내                                  용

형         식

SEGMENT

-

END

어셈블리 프로그램은 한 개 이상의 세그먼트들로 구성된다. SEGMENT 지시어는 하나의 세그먼트를 정의한다.

segname SEGMENT ; 세그먼트 시작

⋮ ; 세그먼트 내용

segname ENDS ; 세그먼트 끝

PROC

-

ENDP

매크로 어셈블리에서는 프로그램의 실행 부분을 모듈로 작성할 수 있다. 이 모듈을 프로시저(Procedure)라 부르며, PROC 지시어가 이를 정의한다.

procname PROC ; 프로시저의 시작

⋮ ; 프로시저의 내용

procname ENDP ; 프로시저의 끝

ASSUME

어셈블러에게 세그먼트 레지스터와 사용자가 작성한 세그먼트의 이름을 연결시킨다.

ASSUME SS:stack_segname,

DS:data_segname,

CS:code_segname,

ES:extra_segname

END

전제 프로그램의 끝을 나타냄

END

데이터 정의 지시어 : 프로그램에서 데이터를 저장할 기억 장소를 정의, 초기값 부여

DB

Define Byte

name DB 초기값

DW

Define Word

name DW 초기값

DD

Define Double Word

name DD 초기값

DQ

Define Quad Word

name DQ 초기값

DT

Define Ten Bytes

name DT 초기값

EQU

변수 이름에 데이터값이나 문자열 정의

name EQU 데이터값/문자열

=

EQU와 달리 정의된 값을 변경 가능

EVEN

어셈블리시 이 지시어가 사용되는 곳의 주소가 짝수로 되도록 함

PAGE

어셈블리 리스트의 형식을 결정

PAGE [length][,width]

TITLE

어셈블리 리스트의 각 페이지에 제목 출력

TITLE t5ext

※ 세그먼트(SEGMENT)와 오프셋(OFFSET)

16비트 레지스터를 사용하여 주소를 표현한다면, 216Byte = 65536 Byte = 64 KByte 의
주소 공간을 가질 수 있다. 그러나 지정 가능 주소 공간의 크기를 늘리기 위하여
'세그먼트', '오프셋'의 개념을 사용한다. 개념적으로는 메모리를 가리키는 화살표를
세그먼트(SEGMENT)라고 하고 그곳을 기준으로 떨어진 변위(DISPLACEMENT)를
오프셋(OFFSET)이라고 한다.
8086은 세그먼트를 16바이트 단위로 취하여 그곳으로부터 오프셋 지정으로 주소값을 얻는다.
세그먼트값 × 16 + 오프셋 = 실제주소

16을 곱한다는 것은 왼쪽으로 4번 시프트 한것과 같다. 이 때, 세그먼트 레지스터는
16비트이므로 실제 주소는 16비트를 왼쪽으로 4번 시프트한 20비트의 주소 공간을
가리킬 수 있게된다.

예를 들어, 세그먼트가 A000, 오프셋이 00FF 일 때 실제 주소 값은 다음과 같이 계산할 수 있다.

A

0

0

0

세그먼트

+

0

0

F

F

오프셋

A

0

0

F

F

실제 주소값

이러한 세그먼트, 오프셋에 의한 방식의 장점은 작은 레지스터 크기로도
넓은 주소 공간을 가리킬 수 있다는 것이다.

8086의 경우 20비트의 주소 공간이므로 220Byte = 1048576 Byte = 1 MByte 까지의
주소 공간을 가질 수 있다.

Posted by 혁쌈

2007/05/04 01:31 2007/05/04 01:31
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/269

Static keyword

처음에 제대로 해놓지 않으니 자꾸 버벅거리는구만 -_-;
확실히 알고 넘어가자!

more..

Posted by 혁쌈

2006/12/08 10:47 2006/12/08 10:47
Response
No Trackback , 2 Comments
RSS :
http://trlight.cafe24.com/tc/rss/response/257

Pragma

#pragma 는 #로 시작하는 전처리구문 지시자 중 컴파일러에 종속적인 명령으로,
컴파일러에 특정한 옵션 명령을 내리기 위해 사용하는 데요,

컴파일러에 종속적이기 때문에 컴파일러를 변경했을 경우 실행을 보장하지 못합니다.

대표적인 #pragma 명령 중에서 once나 pack, comment(lib, *) 등이 있는데 이는 각각
컴파일러에

1 once : 해당 소스가 단 한번만 포함되게 한다(여러 번 인클루드 되는 것을
컴파일러 차원에서 막아줍니다)

2 pack : 변수 정렬을 인위적으로 변경시킨다(보통은 4바이트로 지정되어 있습니다)

3 comment(lib, *) : comment로 사용할 수 있는 명령은 여러 개 있는데,
그중 가장 대표적인 것이 lib 으로, 해당 라이브러리를 링크시켜준다

과 같은 명령을 내립니다.



api나 mfc의 구분과 관계없이 해당 컴파일러에서 사용하는 명령이랍니다




MSDN에 있는 내용
code_seg
#pragma code_seg( ["section-name"[,"section-class"] ] )

Specifies a code section where functions are to be allocated. The code_seg pragma specifies the default section for functions. You can, optionally, specify the class as well as the section name. Using #pragma code_seg without a section-name string resets allocation to whatever it was when compilation began.

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

실행파일에는 코드영역과 데이터영역이 구분되어 있다는 것은 아시지요.
┌───────┐
│                     │
│                     │
│   데이터영역   │
│                     │
│                     │
├───────┤
│                     │
│                     │
│     코드 영역   │
│                     │
│                     │
└───────┘
이런 식의 그림은 아마 어디선가 많이 보셨을겁니다.(그림이 깨지네요.편집할 땐 제대로 보였는데...)
이런 영역을 section이라고 하지요. 위의 설명에 나오는 section이라는 용어가 이것입니다.
실제로 데이터 영역과 코드 영역외에도 exe나 dll에는 여러 section을 포함할 수 있습니다.
이건 dumpbin이라는 툴로 살펴볼 수 있습니다.
제 컴(Windows XP)에서 dumpbin c:\windows\notepadd.exe 를 해 보았더니

2000 .data
2000 .rsrc
7000 .text

이렇게 나오는 군요.

여기서 .data에는 초기화된 데이터가 .rsrc에는 리소스들이, .text에 코드가 들어갑니다.
이러한 .data, .rsrc, .text 등은 일반적으로 정해져 있는 것들입니다.
위 MSDN의 설명에 있는 section-name이라는 것이 바로 .data, .rsrc, .text 등을 뜻하는 겁니다.
즉, #pragma code_seg( .data ) 처럼 사용한다는 거지요.
그리고 Specifies a code section where functions are to be allocated.라는 설명은
Specifies a section where functions or data or etc. are to be allocated. 이렇게 이해하면 더 나을 듯 하네요.

그런데 이런 정해진 이름말고도 사용자가 새로운 영역을 정할 수 있습니다.

#pragma data_seg("Shared")
DWORD g_dwThreadIdPMRestore = 0;
HWND g_hwnd = NULL;
#pragma data_seg()

이런 식으로 하면 g_dwThreadIdPMRestored와 g_hwnd가 디폴트 데이터 섹션인 .data에 배치되지 않고,
Shared라는 이름으로 만들어진 섹션에 배치되는 것입니다.

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

#pragma data_seg(...)가 사용되는 곳은
dll간의 데이터 공유를 위해 사용될 수 있습니다.
그리고 그 외에 어디서 사용되는지는 저도 아직 본 적이 없어서 잘 모르겠습니다.

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

참고로 위의 내용은 "어드밴스 윈도우 NT"를 참고해서 작성했습니다.
이 책은 지금 나오지 않고 이 책의 새 버전이 "Programming Applications for Microsoft Windows"(Jeffrey Richer 저)로
번역판도 나와 있습니다.

Posted by 혁쌈

2006/11/28 16:56 2006/11/28 16:56
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/255

프로그래밍과제 수행 안내서

 

[C 프로그램]

단계1: 주어진 문제와 관련된 영역에 대하여 충분한 사전 지식을 확보한다.

단계2: 주어진 문제를 분석하고 해결해야 할 문제의 내용을 충분히 이해한다. 이해되지 않는 부분이 있으면 교재 및 강의 자료를 다시 학습한다.

단계3: 작성할 프로그램이 가져야 할 주요 기능을 파악하여 최상위 프로세스를 설정한다.

       이를 하향식으로 분해하여 하위 프로세스를 만든다. 모든 프로세스가 20-40 라인 정도의 함수로 구현될 정도의 크기가 될 때까지 이 과정을 반복한다.

단계4: 단계3에서 하향식 분해한 결과를 바탕으로 시스템 구조도를 작성한다.

단계5: 각각의 모듈이 자신의 책임을 완수하는데 필요한 자료구조를 설계한다.

단계6: 설계 문서를 기초로 하여 구현할 함수에 대한 signature를 작성한다.

단계7: 문제에서 요구한 프로그래밍 platform 상에서 코딩한다.

단계8: 단계3에서 발견한 주요 기능에 대한 테스트 케이스를 만들고, 테스트를 실시한다. 문제를 완전히 해결할 때까지 테스트를 반복하여 프로그램을 완성한다.

[C++ & Java 프로그램]

단계1: 주어진 문제와 관련된 영역에 대하여 충분한 사전 지식을 확보한다.

단계2: 주어진 문제를 분석하고 해결해야 할 문제의 내용을 충분히 이해한다. 이해되지 않는 부분이 있으면 교재 및 강의 자료를 다시 학습한다.

단계3: 주어진 문제 영역에 존재하는 주요 object를 발견하고, 이를 추상화하여 class를 만든다.

단계4: object 사이의 interaction을 통하여 문제 해결 방안을 도출하고, 그 결과를 sequence

       diagram으로 표현한다.

단계5: sequence diagram으로부터 주요 class가 담당해야하는 책임을 설정한다.

단계6: 각각의 class에 대하여 자신의 책임을 완수하는데 필요한 attributes를 도출한다.

단계7: attributes에 대하여 자료구조를 설계하고, 필요한 경우에 새로운 class를 만든다.

단계8: 각각의 class에 대하여 operations를 도출한다.

단계9: class들 사이의 관계를 발견하여 class diagram으로 표현한다.

단계10: attributes와 operations에 대한 access specifier를 기술한다.

단계11: 문제에서 요구한 프로그래밍 platform 상에서 코딩한다.

단계12: 단계3에서 발견한 주요 기능에 대한 테스트 케이스를 만들고, 테스트를 실시한다.

        문제를 완전히 해결할 때까지 테스트를 반복하여 프로그램을 완성한다.

구현시 유의 사항


• 변수와 함수의 이름은 담당하는 기능에 맞게 작명

• 모든 문장과 수식은 간결하고 명확하게 작성

• 다른 프로그래머가 쉽게 읽을 수 있도록 표현

• 모든 변수와 수식에는 반드시 comments를 붙일 것

• global variable은 절대로 사용하지 말것

• 임시변수의 사용은 가능한 한 회피
• 혼돈을 초래할 수 있는 변수명은 사용하지 말것
• 일관성 있는 변수명을 사용
• 문장 그룹이 명확하도록 { }와 들여쓰기 사용
• if 다음에 if가 따라오는 구조나 null else는 피하라
• 문장의 반복은 최소화
• 모듈화

Posted by 혁쌈

2006/11/15 00:38 2006/11/15 00:38
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/252

참고서적

// 윈도우 디바이스 드라이버 개발 관련
________________________________________________________

WRITING WINDOWS WDM DEVICE DRIVERS
R&D TECHNICAL BOOKS * Chris Cant * 원서 * 1999-08-12

________________________________________________________

WRITING WINDOWS WDM DEVICE DRIVERS(번역판)
에이콘출판 * CHRIS CANT * 번역서

________________________________________________________

WINDOWS WDM DEVICE DRIVERS(재번역판)
에이콘 * Chris Cant * 번역서 * 2002-07-05

________________________________________________________


WINDOWS DEVICE DRIVER PROGRAMMING(국내)
삼양출판사 * INDUSTRIAL NETWORK팀 * 국내서 * 2000-06-27

________________________________________________________

UNDOCUMENTED WINDOWS 2000 SECRETS
Addison Wesley * SCHREIBER * 원서 * 2001-08-23

________________________________________________________

WINDOWS NT FILE SYSTEM INTERNALS
O'REILLY * NAGAR * 원서 * 1997-11-13

________________________________________________________

PROGRAMMING THE MICROSOFT WINDOWS DRIVER MODEL
MICROSOFT PRESS * Walter Oney * 원서 * 1999-12-09

________________________________________________________

PROGRAMMING THE MICROSOFT WINDOWS DRIVER MODEL 2nd Edition
MICROSOFT PRESS * Walter Oney * 원서 * 2002-12-31

________________________________________________________


PROGRAMMING THE MICROSOFT WINDOWS DRIVER MODEL
(번역판)
정보문화사 * Walter Oney * 번역서 * 2001-07-13

________________________________________________________

The Windows 2000 Device Driver Book 2/E
Prentice Hall * Art Baker 외 * 원서 * 2000-11-20

________________________________________________________

MICROSOFT WINDOWS 2000 DRIVER DEVELOPMENT KIT(전3권)
MICROSOFT PRESS * 원서 * 2000-05-25

________________________________________________________

The Windows NT Device Driver Book
Prentice Hall * BAKER * 원서 * 1997-07-21

________________________________________________________

WINDOWS NT DEVICE DRIVER DEVELOPMENT
NRP * Peter G. Viscarola 외 * 원서 * 1999-01-15

________________________________________________________

DEVELOPING WINDOWS NT DEVICE DRIVERS
Addison Wesley * Edward N. Dekker 외 * 원서 * 1999-05-25

________________________________________________________

WRITING WINDOWS VxDs AND DEVICE DRIVERS(2/E)
R&D TECHNICAL BOOKS * Karen Hazzah * 원서 * 1998-01-12

________________________________________________________

WRITING WINDOWS VIRTUAL DEVICE DRIVERS
Addison Wesley * THIELEN * 원서 * 1999-02-27

________________________________________________________
// 리눅스 디바이스 드라이버 개발 관련
________________________________________________________

LINUX DEVICE DRIVERS
O'REILLY * RUBINI * 원서 * 1998-03-23

________________________________________________________

LINUX DEVICE DRIVERS(2/E)
O'REILLY * Alessandro Rubini 외 * 원서 * 2001-07-25

________________________________________________________

리눅스 디바이스 드라이버(번역판)
한빛미디어 * Alessandro Rubini * 번역서 * 2000-02-14


________________________________________________________
// 유닉스 디바이스 드라이버 개발 관련
________________________________________________________

UNIX SVR4.2 MP DEVICE DRIVER REFERENCE FOR INTEL PROCESSORS
UNIX PRESS * HINES * 원서 * 1996-04-06

________________________________________________________

WRITING A UNIX DEVICE DRIVER
WILEY * EGAN * 원서 * 1994-07-27

Posted by 혁쌈

2006/11/10 09:11 2006/11/10 09:11
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/249

유스케이스 분석기법(Use-case)

클래스를 도출하는 방법으로서 유스케이스 분석기법을 사용할 수 있다. 유스케이스(Use-case)는 객체짛야 밥ㅇ법론 및 컴포넌트 기반 방법론(CBD, Component-Based Development)에서 시스템에 대한 요구사항을 정의할때 일반적으로 사용되는 개념이다. 개발자는 우선 시스템이 제공할 기능을 유스케이스 단위로 정의한다. 예를 들어 현금 자동 인출기 시스템의 경우에는 입금, 출금, 이체, 조회 등이 유스케이스가 될 수 있다.

  개발자가 이 유스케이스를 분석하여 몇몇 유형의 도출하는 방법이 일반적으로 사용되며, 이 방법을 유스케이스 분석 기법이라고 부른다. 유스케이스 분석기법은 각 유스케이스의 내용을 분석하여 다음과 같은 세가지 유형의 클래스를 도출하려고 노력한다.

▶ 경계클래스(boundary class)

  개발할 시스템과 시스템 외부와의 연결, 즉 인터페이스 역할을 하는 클래스들을 경계클래스라고 부른다. 유스케이스 기법에서는 시스템 외부의 존재를 액터(Actor)라고 부르며, 일반적으로 액터는 사용자와 연동되는 외부의 시스템으로 분류된다. 따라서 사용자와의 인터페이스 즉 사용자 인터페이스를 위하여 사용되는 각종 화면(예를들면 VB의 Form, ASP 페이지, JSP페이지, ASP.NET페이지등)이 바로 경계클래스에 해당된다.

  그리고 외부 시스템과의 연동을 위한 클래스로서는  예를들면 현금 자동 인출기 시스템의 경우에는 사용자가 요청한 입금, 출금, 이체, 조회 등을 실제로 처리하기 위하여 연동되는 은행의 전산 시스템이 전형적인 예다. 현금 자동 인출기 시스템은 이 은행 전산 시스템과의 통신을 통하여 입금, 출금, 이체, 조회 등을 처리해야 하며, 이때 은행 전산 시스템과의 통신 기능을 전담하는 클래스를 경계클래스라고 부른다. 위에서 소개한 전형적인 유형의 클래스 중에서 시스템 외부와의 인터페이스 역할을 하는 클래스가 바로 유스케이스 분석 기법에서 말하는 경계클래스에 해당된다.

▶실체클래스(entity class)

  실체클래스는 영속적인 정보(시스템의 수행이 종료되어도 그 값이 유지되어야 하는 정보_와 그 정보에 대한 조작 기능을 제공하는 클래스다. 예를들어 온라인 서점 시스템의 경우에는 등록된 도서와 사용자에 대한 정보는 시스템이 종료되어도 계속 유지되어야 한다.

  실체클래스는 위에서 설명한 전형적인 유형으 ㅣ클래스 중에서 업무와 적업의 참여자 및 결과물 유형에 해당된다. 왜냐하면 참여자 및 결과물에 대한 정보는 일반적으로 시스템의 종료와 상관없이 계속해서 유지될 필요성이 있기 때문이다.

▶제어클래스(control class)

  제어 클래스는 시스템이 제공할 유스케이스의 제어 로직 및 비즈니스 로직을 제공하는 클래스라고 정의된다. 일반적으로 유스케이스 분석 기법에서는 각 유스케이스에 해당되는 하나의 제어 클래스를 정의하기도 한다.


Posted by 혁쌈

2006/10/02 21:37 2006/10/02 21:37
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/245

개발 2주차;


개발이라는 수식어를 붙이기엔 너무 부끄럽군 -_-;
대충 인터페이스는 갖춰졌고 FTP로써의 기능테스트 중이다. 아직 업/다운로드가 좀 이상하지만;;
길게잡아 한 2주정도면 결과물이 나올듯 하다. 또 언제 어디서 버그나 튀어나올진 모르겠지만서도 ㅋㅋ
만들다가 느낀점인데, MFC라이브러리만 꿰뚫고 있어도 내가 생각하는 왠만한것들은 모두 구현할수 있을듯;
그게 안된다는게 에러지만 ㅋㅋ
빨리 마무리짓고 딴거 해야겠따.

Posted by 혁쌈

2006/08/08 13:16 2006/08/08 13:16
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/227

LIBCD.lib(crt0.obj) : error LNK2001: unresolved external symbol _main
Debug/NPR_test1.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.



이런 에러가 나는 경우는.. 프로젝트를 console로 만든뒤... 다른 라이브러리를 쓴 경우나,
atl로 프로젝트를 만드신뒤.. c런타임 라이브러리를 사용한 경우.




Win32 Application으로 Project를 생성한 후, 다시 컴파일

Posted by 혁쌈

2006/01/04 14:46 2006/01/04 14:46
Response
No Trackback , No Comment
RSS :
http://trlight.cafe24.com/tc/rss/response/173


블로그 이미지

No pains, No gains.

- 혁쌈

Archives

Authors

  1. 혁쌈

Recent Trackbacks

  1. rjixambb rjixambb 10/30

Calendar

«   2009/11   »
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          

Site Stats

Total hits:
80138
Today:
7
Yesterday:
52