728x90

분류 전체보기 518

volatile 변수

주로 메모리 맵 입출력(MMIO)을 제어할 때, volatile을 선언한 변수를 사용하여 컴파일러의 최적화를 못하게 하는 역할을 한다.static int foo; void bar(void) { foo = 0; while (foo != 255); } foo의 값의 초기값이 0 이후, while 루프 안에서 foo의 값이 변하지 않기 때문에 while의 조건은 항상 true가 나온다. 따라서 컴파일러는 다음과 같이 최적화한다.void bar_optimized(void) { foo = 0; while (true); } 이렇게 되면 while의 무한 루프에 빠지게 된다. 이런 최적화를 방지하기 위해 다음과 같이 volatile을 사용한다.static volatile int foo; void bar (void) ..

13장 코드 분량 줄이기

PART Ⅲ. 코드 재작성하기 13장. 코드 분량 줄이기 - 프로그래머가 배워야 하는 가장 중요한 기술은 언제 코딩을 해야 하는지 아는 것이다. ★ 가장 읽기 쉬운 코드는 아무것도 없는 코드다. __1. 그 기능을 구현하려고 애쓰지 마라. 그럴 필요가 없다. - 프로그래머는 대개 프로젝트에 정말로 필요한 기능이 얼마나 있는지 과대평가하는 경향이 있다. - 또한 어떤 기능을 구현하는 데 필요한 노력을 과소평가하는 경향도 있다. - 이는 조잡한 프로토타입을 구현하는 시간을 지나치게 낙관적으로 에측하고, 그 코드를 장차 유지보수하고, 문서를 만들고, 코드 베이스에 새로운 '무게'를 더하는데 얼마나 많은 시간이 필요한지를 완전히 잊어버리게 한다. __2. 요구사항에 질문을 던지고 질문을 잘게 나누어 분석하라. ..

12장 생각을 코드로 만들기

PART Ⅲ. 코드 재작성하기. 12장. 생각을 코드로 만들기 - 복잡한 생각을 다른 사람에게 설명할 때 중요하지 않은 자세한 내용 때문에 듣는 사람을 혼동시키는 일이 종종 있다. - '쉬운 말'로 자신의 생각을 지식이 부족한 사람에게 전달하는 기술은 매우 중요하다. - 여기에는 설명할 내용을 걸러서 요지만 뽑아내는 능력이 요구된다. - 코드도 마찬가지로 '쉬운 말'로 작성되어야 한다. - 이 장에서 설명할 코드를 더 명확하게 만드는 간단한 과정은 다음과 같다. 1. 코드가 할 일을 다른 사람에게 설명하듯이 '쉬운 말'로 묘사하라. 2. 이 설명에 들어가는 핵심적인 단어와 문구를 포착하라. 3. 설명과 부합하는 코드를 작성하라. __1. 논리를 명확하게 설명하기 - 예제 코드는 '사용자가 페이지를 볼 수..

11장 한 번에 하나씩

PART Ⅲ. 코드 재작성하기 11장. 한 번에 하나씩 - 한 번에 여러 가지 일을 수행하는 코드는 이해하기 어렵다. ★ 한 번에 하나의 작업만 수행하게 코드를 구성해야 한다. (코드를 '탈파편화(Defragmenting)'하라.) - 하나의 함수는 오직 한가지 작업만 하게 하는 것이 좋지만, 큰 함수를 독자적인 논리적 영역들로 재구성하는 것만으로 가독성에 도움이 된다. - 코드가 한 번에 한가지 일만 수행하게 하는 절차는 다음과 같다. 1. 코드가 수행하는 모든 '작업'을 나열한다. 이때 작업은 아주 간단한 일일수도 있고, 아주 모호한 일일수도 있다. 2. 이러한 작업을 분리하여 서로 다른 함수로 혹은 적어도 논리적으로 구분되는 영역에 놓을 수 있는 코드로 만들어라. __1. 작업은 작을 수 있다. -..

C언어 파일처리 주요예제 2 (고수준 파일 입출력2)

8. 데이터 파일에서 정수를 읽은 후, 2진트리에 순서에 맞게 저장한 다음, 전위운행한 다음 정렬한 결과를 다른 파일에 정렬하여 넣는 프로그램. #include #include #include #define LEFT 0 #define RIGHT 1 typedef int DATA; struct node { DATAd; node*left; node*right; }; typedef node* BTREE; BTREE new_node(DATA d1); void add_node(BTREE parent, BTREE r_node, DATA d1, int r_1); void inorder(FILE* ofp, BTREE root); BTREE root = NULL; int main() { DATA a; int size =..

C언어 파일처리 주요예제 1 (고수준 파일 입출력1)

1. c언어로 작성된 프로그램을 읽어서 화면으로 보여주는 프로그램을 작성하세요. #include #include #include void display(FILE* fp); //화면에 출력하는 함수 int main() { char fname[20], cExit; FILE* fp; do { printf("input file name : "); gets_s(fname, 20); fopen_s(&fp,fname,"r"); if (fp == NULL) { fprintf(stderr, "cannot open this file : %s \n", fname); } else { display(fp); } printf("\n\n Any key... or 'q' to exit..."); cExit = getchar(); }..

C언어 이론 12. 파일처리(고수준의 파일 입출력 2. 텍스트 입출력함수)

내용 출처 : YES C (정보공학연구소 /생능출판사) 혼자 연구하는 C/C++ (SoEn.kr /와우북스) Ⅰ. getc(), fgetc() / putc(), fputc() //한 문자를 입출력하는 함수 ① 원형 int getc(FILE* _Stream); int putc(int _Character, FILE* _Steream); int fgetc(FILE* _Stream); int fputc(int _Character, FILE* _Stream); ② getc(FP)는 지정한 스트림으로부터 한 문자를 읽어드리고, FP를 1증가시킨다. ③ getc(stdin)은 키보드로부터 한 문자를 읽어들이고, getc(FP)는 FP가 가리키는 파일 스트림으로부터 한 글자를 읽어들인다. ④ getc(FP)의 FP가 ..

C언어 이론 12. 파일처리 (고수준의 파일 입출력 1. 열고닫기)

내용 출처 : YES C (정보공학연구소 /생능출판사) 혼자 연구하는 C/C++ (SoEn.kr /와우북스) Ⅰ. 파일 열고 닫기 ① 파일에 데이터를 입출력하려면 제일 먼저 파일을 열어서 실행중인 프로그램과 파일간의 스트림을 연결해야한다. ② 파일을 열고 작업이 끝나면 파일을 닫아 스트림을 닫아주어야 작업이 파일에 저장된다. ③ 고수준의 입출력에서는 이 스트림을 FP(파일포인터)로 관리한다. ④ 고수준의 입출력에서 파일을 여는 함수는 fopen_s()이고 닫는 함수는 fclose()이다. ⑤ fopen()의 경우 파일을 열고 FP값을 반환값으로 주기 때문에 이를 저장하지 않는 실수를 할 수도 있었지만, fopen_s()의 경우 FP값을 첫번째 인자로 요구하기 때문에 그럴수가 없다. Ⅱ. fopen_s()..

C언어 이론 12. 파일처리 (기본, 스트림, 고수준의 파일 입출력 함수들)

내용 출처 : YES C (정보공학연구소 /생능출판사) 혼자 연구하는 C/C++ (SoEn.kr /와우북스) Ⅰ. 파일처리 기본 ① '파일'이란 '프로그램을 처리하는데 사용되는 입출력 장치에 적용되는 논리적 개념'이다. ② '파일'은 '디스크에 정보가 저장되는 단위'이며 고유의 이름을 가진다. ③ C언어는 파일 입출력 방식으로 고수준과 저수준 두가지를 지원한다. 둘의 차이점은 다음과 같다. 고수준 저수준 버퍼 사용 사용 메모리로 직접 읽어들임 입출력 대상 스트림 파일 핸들 속도 느리다. 빠르다. 문자 단위 입출력 가능 가능하지만 비효율적이다. 세밀한 조작 어렵다. 가능하다. 난이도 비교적 쉽다. 조금 어렵다. ④ 두 방식의 가장 큰 차이점은 버퍼의 사용 유무이며 나머지는 이에 따라 파생되는 특성들이다. ..

반응형