일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- C++
- 파이썬
- c#
- 안드로이드 앱 개발
- 산책하기 좋은 곳
- 알고리즘
- 추천
- 언제나휴일
- 표준 라이브러리 함수
- 강의
- 유튜브 동영상 강의
- 프로젝트
- 네트워크 프로그래밍
- 충남 천안
- 무료 동영상 강의
- 언제나 휴일
- c언어
- 졸업 작품 소재
- 캡슐화
- 원격 제어 프로그램
- 표준 입출력
- Windows Forms
- 소켓 통신
- 실습
- 동영상
- 동영상 강의
- 독립기념관
- 실습으로 다지는 c#
- 클래스 다이어그램
- 소스 코드
- Today
- Total
목록C & C++ (210)
프로그래밍 언어 및 기술 [언제나휴일]
long ftell ( FILE * fp ); 파일 스트림의 offset을 가져오는 함수 입력 매개 변수 리스트 fp 파일 스트림 반환 값 파일 스트림의 파일 position의 현재 값, 실패 시 -1 사용 예 //C언어 표준 라이브러리 함수 가이드 //long ftell ( FILE * fp ); 파일 스트림의 offset을 가져오는 함수 //파일에 회원 데이터를 출력하고 다시 파일을 열어 파일의 크기를 확인 #include #define MAX_NAME_LEN 20 typedef struct{ char name[MAX_NAME_LEN+1]; int age; }Member; #define MAX_MEMBERS 10 int main (void) { FILE * fp; Member members[MAX_M..
fread 함수 [C언어 표준 라이브러리 함수] size_t fread ( void * base, size_t size, size_t count, FILE * fp); 파일 스트림에서 데이터를 읽는 함수 입력 매개 변수 리스트 base 데이터를 읽어올 버퍼 size 읽어올 데이터 하나의 크기 count 읽어올 데이터 개수 fp 입력 파일 스트림 반환 값 읽어온 데이터 개수 fread 함수는 요청한 데이터 개수보다 반환 값이 작다고 오류가 아니며 파일에 데이터를 모두 읽어온 것입니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //size_t fwrite ( const void * base, size_t size, size_t count, FILE * fp); 파일 스트림에 데이터를 쓰는 함수 //회..
fwrite 함수 [C언어 표준 라이브러리 함수] size_t fwrite ( const void * base, size_t size, size_t count, FILE * fp); 파일 스트림에 데이터를 쓰는 함수 입력 매개 변수 리스트 base 기록할 데이터가 있는 주소 size 기록할 데이터 하나의 크기 count 기록할 데이터 개수 fp 출력 파일 스트림 반환 값 성공하면 쓰기 요청한 count, count 보다 작은 값을 반환하면 에러 fwrie 함수는 메모리에 있는 내용을 그대로 파일에 덤프하는 것입니다. 따라서 메모장과 같은 텍스트 편집기로 확인하면 글자가 깨진 것처럼 보입니다. 메모장과 같은 프로그램으로 출력 파일을 열어서 확인하였을 때 글자가 깨졌다고 문제가 있는 것이 아닙니다. 사용 예..
int fflush ( FILE *fp); 파일 스트림 버퍼를 비우는 함수 입력 매개 변수 리스트 fp 파일 스트림 반환 값 성공 시 0, 에러 시 EOF 출력 스트림 버퍼에 남아있는 내용을 출력 스트림에 출력하는 동작을 수행합니다. 하지만 입력 스트림에서 어떻게 동작해야 하는지는 표준 문서에서 정의하지 않았습니다. scanf 함수처럼 포멧에 맞게 입력을 받을 때 최종 사용자의 입력 내용이 포멧 문자열보다 더 많은 내용을 포함하고 있으면 버퍼에 처리하지 않은 데이커가 남습니다. 이처럼 스트림 버퍼의 내용을 비울 때 fflush 함수를 사용합니다. 하지만 C 표준 문서를 보면 구체적인 행위를 정의하지 않았습니다. 실제 컴파일러에 따라 처리하는 방식이 다릅니다. 저자가 테스트 해 본 Microsoft Vis..
int vprintf ( const char * format, va_list arg ); 버퍼에 포멧을 지정하여 가변 인자를 출력하는 함수 입력 매개 변수 리스트 format 포멧 문자열 arg 가변 인자 반환 값 성공 시 출력한 문자 개수, 실패 시 음수 사용 예 //C언어 표준 라이브러리 함수 가이드 //int vprintf ( const char * format, va_list arg ); 버퍼에 포멧을 지정하여 가변 인자를 출력하는 함수 //메시지와 가변 인자 리스트를 받아 표준 출력 스트림에 출력 #include #include //가변 인자를 받아 표준 스트림에 출력하는 함수 void MyPrint(const char *msg, const char * format, ...) { va_list ..
sscanf 함수, sscanf_s 함수 [C언어 표준라이브러리 함수] int sscanf (const char * buffer ,const char *format,…); 버퍼에서 포멧을 지정하여 읽어오는 함수 입력 매개 변수 리스트 buffer 소스 문자열 format 포멧 문자열 … 가변 인자 리스트 반환 값 변환 성공한 개수 소스 문자열에 있는 내용으로 설정할 버퍼의 크기가 작으면 버퍼 오버플로우 현상이 발생할 수 있습니다. C11에서는 이를 개선한 sscanf_s를 제공하고 있습니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int sscanf (const char * buffer ,const char *format,...); 버퍼에서 포멧을 지정하여 읽어오는 함수 //문자열의 내용을 ..
sprintf 함수 [C언어 표준 라이브러리 함수] int sprintf ( char * buffer, const char * format, … ); 버퍼에 포멧을 지정하여 출력하는 함수 입력 매개 변수 리스트 buffer 출력할 버퍼 format 포멧 문자열 … 가변 인자 리스트 반환 값 버퍼에 출력한 문자 개수 버퍼의 크기를 전달하지 않아서 sprintf 함수 내부에서는 버퍼의 크기를 알 수가 없습니다. 버퍼에 출력할 내용이 버퍼 크기보다 크면 버퍼 오버플로우 문제가 발생합니다. C11에서는 이러한 문제를 개선한 sprintf_s 함수를 제공합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int sprintf ( char * buffer, const char * format, ... );..
int fscanf (FILE * fp ,const char *format,…); 파일 스트림에 포멧을 지정하여 읽는 함수 입력 매개 변수 리스트 fp 입력 파일 스트림 format 포멧 문자열 … 가변 인자 리스트 반환 값 성공 시 변환 성공 개수, 오류 시 EOF fscanf 함수도 scanf 함수처럼 문자열을 읽어올 때 버퍼 크기를 전달하지 않아 버퍼 오버플로우 문제가 발생할 수 있습니다. C11에서는 이를 개선한 fscanf_s를 제공합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int fscanf (FILE * fp ,const char *format,...); 파일 스트림에 포멧을 지정하여 읽는 함수 //회원 정보를 파일에 쓴 후에 다시 읽어와서 출력 #pragma warning..
fgets 함수 [C언어 표준 라이브러리 함수] char *fgets(char * buffer, int max,FILE * stream); 파일 스트림의 버퍼에서 문자열을 읽는 함수 입력 매개 변수 리스트 buffer 문자열을 기록할 버퍼 max 읽어올 문자열을 구성하는 문자 최대 개수 -1 stream 입력 파일 스트림 반환 값 성공 시 buffer, 실패 하거나 파일의 끝을 만나면 NULL 개행 문자를 만나거나 max-1 개를 읽으면 마지막에 종료 문자를 추가합니다. gets에서는 개행 문자를 지우고 종료 문자를 추가하지만 fgets에서는 개행 문자도 그대로 읽습니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //char *fgets(char * buffer, int max, FILE * st..
fgetc 함수 [C언어 표준 라이브러리 함수] int fgetc(FILE *fp); 파일 스트림의 버퍼에서 맨 앞의 문자의 ASCII 코드 값을 반환하는 함수 입력 매개 변수 리스트 fp 입력 파일 스트림 반환 값 성공 시 읽은 문자, 실패 시 EOF를 반환하고 error를 설정 fgetc 함수 호출 결과가 EOF일 때는 읽은 문자가 파일의 끝을 의미하는 EOF이거나 읽기 오류일 때입니다. 따라서 EOF를 반환했다고 반드시 읽기 실패가 아닙니다. 읽기 실패일 때는 error 플래그를 설정하므로 ferror로 확인해야 에러인지 아닌지 판단할 수 있습니다. 사용 예 사용 예 //C언어 표준 라이브러리 함수 가이드 // int fgetc(FILE *fp); 파일 스트림의 버퍼에서 맨 앞의 문자의 ASCII ..
fprintf 함수 [C언어 표준 라이브러리 함수] int fprintf(FILE *fp, const char * format, …); 파일 스트림에 포멧을 지정하여 출력하는 함수 입력 매개 변수 리스트 fp 출력 파일 스트림 format 포멧 문자열, 출력 포멧은 printf 함수와 같습니다. … 가변 인자 리스트 반환 값 성공 시 출력 문자 개수, 실패 시 음수 사용 예 //C언어 표준 라이브러리 함수 가이드 //int fprintf(FILE *fp, const char * format, ...); 파일 스트림에 포멧을 지정하여 출력하는 함수 //다양한 포멧 지정을 사용하여 파일에 출력 #pragma warning(disable:4477) #include #include #include int mai..
fputs 함수 [C언어 표준라이브러리 함수] int fputs ( const char * str, FILE * fp ); 파일 스트림에 문자열을 출력하는 함수 입력 매개 변수 리스트 str 출력할 문자열 fp 파일 스트림 반환 값 실패 시 EOF, 성공 시 음수가 아닌 정수 사용 예 //C언어 표준 라이브러리 함수 가이드 //int fputs ( const char * str, FILE * fp ); 파일 스트림에 문자열을 출력하는 함수 //원본 파일 내용을 출력 파일에 라인 번호를 추가하여 복사 #include #include int main(int argc, char **argv) { FILE * sfp, *dfp; int line_no = 1; char buffer[256]; if (argc !=..
fputc 함수 [C언어 표준 라이브러리 함수] int fputc(int ch,FILE *fp); 파일 스트림에 하나의 문자를 출력하는 함수 입력 매개 변수 리스트 ch 출력할 문자 , 함수 내부에서 unsigned char로 변환해서 출력 fp 파일 스트림 반환 값 실패 시 EOF, 성공 시 출력한 문자 fputc 함수 사용할 때 다음을 주의해야 합니다. 한글을 포함한 파일의 데이터를 fgetc함수로 하나의 문자씩 읽어와서 fputc로 출력할 때 오류가 발생합니다. 이러한 문제를 해결하려면 setlocale 함수를 이용하여 지역을 설정해야 합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int fputc(int ch,FILE *fp); 파일 스트림에 하나의 문자를 출력하는 함수 //파일을 ..
fclose 함수 [C언어 표준 라이브러리 함수] int fclose(FILE *fp); 파일 스트림을 닫는 함수 입력 매개 변수 리스트 fp 파일 스트림 포인터 반환 값 성공 시 0, 에러가 있다면 EOF(EOF는 -1) 사용 예 //C언어 표준 라이브러리 함수 가이드 //int fclose(FILE *fp); 파일 스트림을 닫는 함수 //파일을 읽어 라인 번호와 함께 표준 출력 스트림(콘솔)에 출력 #include int main(int argc, char **argv) { FILE * fp; char ch; int line_no = 1, count = 0; if (argc != 2)//command line에서 인자를 잘못 사용 { printf("사용법: %s [원본 파일명]", argv[0]); ..
fopen, fopen_s 함수 [C언어 표준 라이브러리 함수] FILE *fopen(const char *path,const char *mode); 파일 스트림을 여는 함수 입력 매개 변수 리스트 path 절대 경로 혹은 상대 경로 mode rwba+의 조합 문자열 반환 값 성공 시 파일 스트림 포인터, 실패 시 NULL 포인터 mode는 “r”, “w”, “a”, “rb”, “wb”, “r+”, “w+”, “a+” “r+b”, “rb+”, “w+b”, “wb+”, “a+b”, “ab+”중에서 사용합니다. “r” 읽기 모드 “w” 쓰기 모드, 새로운 파일을 생성, 이미 있으면 파일 내용을 지움 “a” 추가 모드, 파일이 없으면 새로운 파일을 생성, 쓰기 작업 시 파일의 끝에 쓰여짐 “rb”, “wb”,..
scanf, scanf_s 함수 [C언어 표준 라이브러리 함수] int scanf(const char *format,…); 표준 입력 파일 스트림의 버퍼에서 포멧을 지정하여 읽어오는 함수 입력 매개 변수 리스트 foramt 입력 포멧 문자열 반환 값 입력 포멧에 맞게 변환한 개수 scanf 함수로 문자열을 입력받을 때 버퍼의 크기를 전달하지 않습니다. gets 함수처럼 최종 사용자가 버퍼 크기보다 많은 문자를 입력하면 버퍼 오버플로우가 발생합니다. C11에서는 scanf 대신 버퍼 오버플로우 문제를 개선한 scanf_s 함수를 제공하고 있습니다. scanf 함수에 입력 포멧에 포멧 사양자가 아닌 문자도 최종 사용자는 입력해야 합니다. 만약 입력하지 않으면 이전까지 처리하고 이후는 처리하지 않습니다. 그리..
gets, gets_s 함수 - C언어 표준 라이브러리 함수 char *gets(char *buffer); 표준 입력 스트림의 버퍼에서 문자열을 읽는 함수 입력 매개 변수 리스트 buffer: 문자열을 보관할 버퍼 반환 값 성공 시 입력 인자로 받은 buffer 반환, 실패 시 0 반환 gets 함수는 입력 버퍼의 크기를 전달받지 않아 버퍼의 크기를 모릅니다. 이는 최종 사용자가 버퍼의 크기보다 많이 입력했을 때 버퍼 오버플로우 문제가 발생할 수 있습니다. C11에서는 gets 함수 대신 버퍼 오버플로우 문제를 개선한 gets_s를 제공하고 있습니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //char *gets(char *str); 표준 입력 스트림의 버퍼에서 문자열을 읽는 함수 //문자열을 ..
getchar 함수 - C언어 표준 라이브러리 함수 int getchar(void); 표준 입력 스트림의 버퍼에서 맨 앞 문자의 ASCII 코드 값을 반환하는 함수 입력 매개 변수 리스트 없음 반환 값 표준 입력 스트림에 있는 첫 문자 표준 입력 스트림에서 입력받는 함수에는 getchar, gets, scanf 함수 등이 있습니다. 이러한 함수들은 입력 스트림 버퍼가 비어 있으면 최종 사용자로부터 엔터까지 문자열을 입력받습니다. 하지만 처리하지 않은 문자열이 남아 있으면 최종 사용자로부터 입력을 받지 않습니다. getchar 함수는 표준 입력 스트림 버퍼에 첫 문자를 반환하는 함수입니다. 주의할 점은 이전 입력으로 버퍼에 남아 있는 문자가 있으면 최종 사용자로부터 입력받지 않는다는 점입니다. 예를 들어 ..
printf 함수 - C언어 표준 라이브러리 함수 int printf(const char * format, …); 표준 출력 파일 스트림에 포멧을 지정하여 출력하는 함수 입력 매개 변수 리스트 format 포멧 지정 문자열 반환 값 실패 시 음수, 성공 시 출력한 문자 수 포멧 지정 문자열에 % 문자는 변환 사양 문자로 옵션으로 flags와 길이 수정자가 올 수 있으며 필수적으로 어떠한 형식으로 출력할 것인지 포멧 지정자 문자인 diouxXaAeEfFgGp% 중에 하나를 사용합니다. 출력 포멧 지정자 개요 타입(필수): diouxXaAeEfFgGp% 중에 1개 flag(선택): – + # 공백 . (선택) 길이 수정자(선택):hh h l ll j z t 출력 포멧 d,i 는 int 형식 인자를 10진수로..
puts 함수 - C언어 표준 라이브러리 함수 int puts(const char *str); 표준 출력 파일 스트림에 문자열을 출력하는 함수 입력 매개 변수 리스트 str 출력할 문자열 반환 값 실패 시 EOF, 성공 시에는 음수가 아닌 수를 반환 puts 함수는 입력 문자열 뒤에 개행 문자를 뒤에 추가하여 출력합니다. 사용 예 //C언어 표준 라이브러리 함수 가이드 //int puts(const char *str); 표준 출력 파일 스트림에 문자열을 출력하는 함수 //아스키 코드 값을 10진수 16진수, 8진수로 출력 //puts와 printf 함수 문자열 출력 비교 #include int main(void) { puts("Hello World");//puts 함수 내부에서 문자열 뒤에 개행 문자를 ..
putchar 함수 - C언어 표준 라이브러리 함수 int putchar(int ch); 표준 출력 파일 스트림에 하나의 문자를 출력하는 함수 입력 매개 변수 리스트 ch 출력할 문자의 ASCII 코드 값 반환 값 성공 시 출력한 문자, 실패 시 EOF(EOF는 -1) 사용 예 //C언어 표준 라이브러리 함수 가이드 //int putchar(int ch); 표준 출력 파일 스트림에 하나의 문자를 출력하는 함수 //아스키 코드 값을 10진수 16진수, 8진수로 출력 #include int main(void) { int c; int result; printf(" :%8s :%8s :%8s\n", "10진수", "16진수", "8진수"); //숫자 문자 for (c = '0'; c
헤더에는 입출력을 수행에 사용할 수 있는 많은 함수들과 타입, 매크로를 제공합니다. 이 책에서는 헤더에서 제공하는 함수들 중에 C11에서 제시한 함수를 포함하여 35개의 함수 사용법을 소개합니다. C11에서 제시하는 함수는 버퍼 오버플로우 버그를 개발 단계에서 안전하게 구현할 수 있다는 의미에서 기존 함수명 뒤에 _s가 붙습니다. 앞으로 별다른 설명이 없어도 _s가 붙는 함수는 C11에서 제시한 함수라고 생각하시기 바랍니다. 다음은 이 책에서 다루는 헤더의 35개 함수의 원형입니다. void clearerr(FILE * fp); 파일 스트림의 에러 플래그를 지우는 함수 int fclose(FILE *fp); 파일 스트림을 닫는 함수 int feof(FILE * fp); 파일 스트림의 끝인지 테스트하는 함..
C언어는 1972년 벨 연구소의 데니스 리치가 B를 기반으로 만든 언어입니다. 1983년 미국 국가 표준 협회인 ANSI에서 ANSI X3.159-1989 표준을 지정한 것이 C언어 표준의 시작입니다. 1999년 C99 표준으로 잘 알려진 ISO/IEC 9899:1999를 출간하고 2005년에는 ANSI에서도 C99를 표준으로 채택합니다. 그리고 2011년에 C11 표준인 ISO/IEC 9989:2011을 출간합니다. ANSI X3.159-1989 표준에서는 미국 국가 표준 협회에서 최초로 지정하였고 변수 이름과 함수 이름 등을 영어 알파벳과 언더 바, 숫자만 사용할 수 있습니다. char 형식도 다양한 기호와 숫자 문자, 영어 알파벳은 표현할 수 있지만 한글이나 한자 등을 표현하려면 문자열을 빌려서 표..
안녕하세요. 언제나휴일입니다. 이번에는 현재까지 다룬 내용(윈도우 클래스 등록 및 개체 생성, 기본 그리기, 키보드 입력, 마우스 입력, 타이머 입력)을 정리하는 실습을 할게요. 실습할 시나리오는 다음과 같습니다. 주어진 공간 안에서 도형을 이동시키는 프로그램 방향 키를 누르면 도형의 방향이 바뀐다. space 키를 누르면 도형은 멈춘다. 현재 방향과 도형의 좌표(논리 좌표)를 출력하시오. 마우스 왼쪽 버튼을 클릭하면 도형이 바뀐다.(사각형->원->사각형->원…) 도형이 움직일 수 있는 공간을 표시하고 논리 좌표에 맞게 모눈을 그리시오. 도형은 움직일 수 있는 공간 경계 밖으로 이동할 수 없어요. 진입점에서는 윈도우 클래스 등록, 개체 생성, 메시지 루프를 작성합니다. #include #define MY..
안녕하세요. 언제나휴일입니다. Windows API에서 주기적인 작업을 할 수 있게 타이머를 제공하고 있어요. 타이머를 생성할 때는 SetTimer 함수를 이용하고 해제할 때는 KillTimer를 사용합니다. UINT_PTR WINAPI SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse, TIMERPROC lpTimerFunc); hWnd: 타이머 메시지를 처리할 윈도우 nIDEvent: 타이머 일련 번호(개발자가 정의) uElapse: 타이머 메시지를 발생할 주기(1/1000초 단위) lpTimerFunc: 타이머 메시지를 수행할 함수(NULL 전달하면 hWnd의 콜백 프로시저에 WM_TIMER 메시지 발생 typedef VOID (CALLBACK* TIMERPR..
안녕하세요. 언제나휴일입니다. 이전 강의에서 마우스 입력을 알아보았어요. 이번에는 키보드 입력을 알아볼게요. Windows API 키보드 입력에 관한 주요 메시지는 WM_KEYDOWN, WM_KEYUP, WM_CHAR 입니다. 윈도우즈 운영체제에서 키보드 포커스를 소유한 윈도우는 전체 시스템에서 유일합니다. 그리고 이러한 메시지(WM_KEYDOWN, WM_KEYUP, WM_CHAR)는 포커스를 소유한 윈도우에게만 발생합니다. 메시지 이름을 보면 알 수 있듯이 WM_KEYDOWN은 키 누름, WM_KEYUP은 키 뗌입니다. WM_CHAR는 문자 키를 입력하였을 때 발생할 수 있는 메시지인데 디폴트로 발생하지는 않습니다. 메시지 루프에서 TranslateMessage를 호출하면 WM_KEYDOWN 메시지 중..
윈도우즈 프로그램에서 사용하는 기본 입력 장치에는 마우스와 키보드가 있습니다. 그리고 시스템에서 제공하는 타이머도 자주 사용하는 입력 장치입니다. Windows API에서 제공하는 마우스 관련 메시지는 크게 세 종류로 구분할 수 있어요. 클라이언트 영역에서 마우스를 누르거나 뗐을 때 발생하는 메시지, NC(Noc Client, 비 클라이언트) 영역에서 마우스를 누르거나 뗐을 때 발생하는 메시지, 그 외의 메시지(마우스 위치를 조사하기 위한 메시지나 마우스 휠 등)가 있어요. 실제 프로그래밍에서 많이 처리하는 메시지는 클라이언트 영역에서 누르거나 뗐을 때 발생하는 메시지입니다. NC 영역에서 발생한 마우스 메시지는 DefWindowsProc에 의해 디폴트 처리를 하는 것이 대부분이겠죠. Client 영역 ..
유튜브 동영상 강의 그리기 WM_PAINT - Windows API 1. DC와 그리기 절차 Windows API에서 그리기는 DC(Device Context)를 이용합니다. DC란 출력에 필요한 여러 정보를 가지고 있는 구조체로 라인이나 경계를 그릴 때 사용하는 펜, 면을 채울 때 사용하는 브러쉬 등의 정보를 갖고 있습니다. DC를 사용하지 않고 그리기를 한다고 가정하면 선을 그리기 위해 두 점의 좌표 뿐만 아니라 선의 형태, 선의 두께, 선의 색상 정보들을 인자로 전달해야 합니다. 사각형을 그리기 위해서는 좌표 뿐만 아니라 경계 선의 형태, 선의 두께, 선의 색상 정보, 면을 채울 색상, 패턴 등의 인자가 필요하겠죠. 이처럼 그리기를 위해 전달해야 하는 인자를 단순화하기 위해 Windows API에서..
유튜브 동영상 강의 윈도우 클래스 등록 및 생성 메시지 루프와 콜백 - Windows API 이번에는 윈도우 클래스를 등록하여 윈도우 개체를 생성하는 형태의 윈도우즈 응용 프로그램을 만들어 보기로 합시다. 이번 프로그램을 통해 윈도우즈 프로그램의 기본적인 동작 흐름을 파악할 수 있습니다. 윈도우즈 프로그램에서 자신의 원하는 형태로 창을 만들기 위해서는 윈도우 클래스를 등록한 후에 등록한 윈도우 클래스 형태의 인스턴스를 생성하는 것이 필요합니다. 윈도우즈 API에서는 비슷한 동작을 하는 버튼이나 리스트 박스 등을 만들 때 미리 등록해 놓은 윈도우 클래스를 이용하여 만들게 하고 있습니다. 다음은 이번에 작성할 윈도우즈 프로그램의 기본 흐름입니다. 제일 먼저 윈도우 클래스 속성을 설정합니다. 윈도우 클래스 속..
Part 33. 함수 포인터와 콜백 115. 함수 포인터와 콜백 개요 C언어 함수 포인터 컴퓨터 프로그램은 수행할 작업들을 논리적으로 표현한 코드의 집합이라고 말할 수 있어요. 그리고 단위 작업의 논리 전개를 한 것이 함수죠. 컴퓨터 CPU내에는 현재 수행할 코드 메모리 주소를 기억하는 프로그램 카운터(PC) 레지스터가 있어요. 대부분의 코드는 수행한 후에 프로그래머 카운터를 1 증가하여 다음 위치에 있는 코드를 수행하죠. 하지만 함수를 호출하면 피호출 함수의 코드로 분기하고 끝나면 호출한 코드 다음 위치에 있는 코드가 동작해요. 이렇게 동작할 수 있는 이유는 함수 이름은 해당 함수가 수행할 코드의 시작 메모리 주소를 값으로 갖고 있기 때문이예요. 배열명이 원소 형식의 포인터라고 말하는 것처럼 함수명은 ..