재밋는 동적 매크로
#define SHOW(id) \
{\
GetDlgItem(IDC_BUTTON##id)->ShowWindow(SW_SHOW);\
}
이렇게 하면
SHOW(4);
IDC_BUTTON4 리소스를 컨트롤 할 수 있다.
이런 식으로 호출 할 수 있다.
이놈의 리소스 ID는 작 맘대로 생겨 버려서…
연번이 안되는 경우가 있어서 반복문을 사용하기 영~ 않좋다.
공간나눔
재밋는 동적 매크로
#define SHOW(id) \
{\
GetDlgItem(IDC_BUTTON##id)->ShowWindow(SW_SHOW);\
}
이렇게 하면
SHOW(4);
IDC_BUTTON4 리소스를 컨트롤 할 수 있다.
이런 식으로 호출 할 수 있다.
이놈의 리소스 ID는 작 맘대로 생겨 버려서…
연번이 안되는 경우가 있어서 반복문을 사용하기 영~ 않좋다.
2013년도에 Windows 8 Pro K 라이센스 프로모션이 있었어요.
그때 2만원이 안되는 가격에 삿죠. 핵 득템! 이었어요.
지금은 윈8에서 윈10으로 무료 업데이트도 안되는 시기인데…
혹시나 하여 윈10을 다운로드(순정) 받아서 Windows 8 Pro K 라이센스로 정품인증을 해봤어요.
윈도우8 , 8.1 링크
http://www.microsoft.com/ko-kr/software-download/windows8
윈도우 10 링크
http://www.microsoft.com/ko-kr/software-download/windows10
정품인증 되네!!!! ㅋㅋㅋㅋㅋㅋㅋ 아이 조아라~~
윈8 프로 라이센스 키 있으신분 윈10 다운받아서 설치해 보세요~~~
윈8 키로 윈 8.1 바로 설치가 안된다는 글도 있던데.. 윈10은 설치할때 걍 윈8프로 라이센스 넣고 설치가 됩니다.
행복하세요~
다 그런건 아닌데요.
스트럭처(구조체, structure)를 파일로 저장할때 신경질이 날때가 있습니다.
typedef struct tagMyStructure
{
int nIdx;
int nNo;
short shAge;
int nIncome;
} MYSTRUCTURE;
MYSTRUCTURE data;
data. nIdx = 0;
data.nNo = 10;
data.shAge = 40;
data.nIncome = 100000;
FILE *hFile;
errno_t eNo = _tfopen_s( &hFile, _T( \temp\test.bin ), _T( “wb” ) );
fwrite( &data, sizeof( data ), 1, hFile );
fclose( hFile );
라고 구조체를 정의하고 필요한 값을 넣은다음에 파일에 써 넣으면 예상과 다른 결과를 마주하게 됩니다.
위에서 저장한 test.bin 파일을 헥사 뷰어 등으로 열어보면
원하는 거… (예상)는 다음과 같을겁니다.
(int : 4바이트, short는 2바이트 이니깐요…)
00 00 00 00 0A 00 00 00 28 00 A0 86 01 00
근데 실제로 헥사 뷰어로 열어보면
00 00 00 00 0A 00 00 00 28 00 CC CC A0 86 01 00
short 뒤에 두바이트가 끼어 들어가요!!!!
뭐뭐임!!!! 내가 원하는건 이게 아냐!!!
컴터야 왜 오동작하니….라고 생각할 수 있어요.
일단 급한건 해결방법
위에 스트럭쳐를 선언할때 위 아래로 다음과 같이 선언해 주세요
pragma pack(push, 2)
typedef struct tagMyStructure
{
int nIdx;
int nNo;
short shAge;
int nIncome;
} MYSTRUCTURE;
pragma pack(pop)
다시 컴파일해서 실행해보면 예상하는데로 결과가 잘 나옵니다.
이제 원인을 알아볼까요?
원인은 우리 컴터가 데이터를 32비트(즉 4바이트)단위로 처리를 하기 때문입니다.
뭐 … 성능때문에 메모리를 4바이트 단위로 읽어서 처리를 한다는게 기본 사상인데요.
한바이트씩 읽으면 4번할꺼 4바이트 한방에 읽으면 속도가 빨라지는 건 당연하겠죠. 그러나 그게… 인간이 느낄 수 있는 시간인지는 모른다에 한표…
하여간… 그런 이유로 파일로 저장할때 구조체의 요소를 다 4바이트로 봐 버립니다. 젠장..
그래서 중간에 껴 있는 short 뒤에 2바이트가 껴들어가는거죠.
실제로 sizeof( data ) 로 구조체의 사이즈를 재면 16이 나옵니다.나는 12바이트짜리 구조체를 선언했는데 말이죠..
그래서 파일 저장도 16바이트가 되버리는데 short에는 2바이트만 정상적인 데이터가 있으니깐 쓰레기 2바이트가 껴 들어가게 됩니다.
이걸 정상화(?) 하기 위해서 #pragma pack(push, 2), #pragma pack(pop) 로 구조체를 싸 줬습니다.
요넘이 무슨 이야기냐… 2바이트 단위로 메모리 억세스해! 라는 소립니다.
긍게 short도 정상적으로 저장이 되고 sizeof( data ) 도 12바이트로 나오고… 잘 되요…
그렇습니다.