목록work (62)
no swim no life
논리적인 명령문 테이블에 입력된 데이터는 논리적인 명령문(코드로 작성된 데이터)보다 유지 보수하기 쉽다. 직접 접근 방식 데이터 자체를 참조 키로 사용 간단하고 빠름 참조 키 조작 데이터를 키 값으로 사용할 수 있도록 수정 월별일수, 보험료 테이블 등 인덱스 접근 방식 어떤 값을 테이블의 키 값으로 직접 쓰기 어려운 경우 메인 테이블을 유지하고, 이를 참조하는 인덱스 테이블을 구성 검색 속도의 이점 메인 테이블에 있는 각 엔트리들의 크기가 크다면, 인덱스 테이블을 이용하여 공간을 줄일 수 있음 인덱스 사용으로 공간적인 이익을 얻을 수 없더라도, 메인 테이블에 있는 엔트리보다 인덱스에 있는 엔트리를 다루는 것이 더 간단 단계적 접근 방식 인덱스 방식처럼 간접적 접근 불규칙적인 값으로 테이블 인덱스를 만들기..
여러 곳에서 리턴하는 루틴 return, exit 문은 프로그램이 원하는 순간에 루틴으로 부터 빠져나갈 수 있는 제어 구조 보다 읽기 쉬운 코드를 만들기 위해서 return을 사용 어떤 루틴에서 답을 알고 있을 때 정리작업 후 곧바로 호출 루틴으로 리턴 복잡한 오류 처리를 단순화하기 위해서 보호절을 사용 정상적인 작업을 수행하기 전에 많은 오류 조건들을 검사해야 하는 코드 재귀적 용법 재귀적 용법에서는 한 루틴이 문제의 작은 부분을 해결하고 그 문제를 더 작은 부분으로 나눈 다음, 더 작은 부분의 각각을 해결하기 위해서 자신을 호출 작은 문제의 그룹인 경우에는 간단하고 훌륭한 해결책이 될 수 있다 재귀적 용법의 예 미로 해결 재귀 호출 사용 팁 재귀 호출이 중단되는지 확인 무한 재귀 호출을 막기 위해서 ..
; 세미콜론 고고 -_-;
루프 제어 루프에 영향을 미치는 요소의 수를 최소화 될 수 있는 한 제어 부분을 루프의 밖에 입력하고, 루프 내에서 실행되어야 하는 조건들을 분명히 한다. 루프 진입 한 위치에서만 진입한다. 루프가 시작되기 바로 전에 초기화 코드를 입력한다. 무한 루프는 while ( true )를 사용한다. 루프 처리 루프에 있는 명력문들을 둘러싸기 위해서 { 과 }을 사용한다. 빈 루프를 피한다. 루프에서 보조 관리 작업들(housekeeping)은 루프의 시작이나 끝에 놓는다. 루프가 하나의 기능만 수행하도록 한다. 루프 종료 종료되는지 확인한다. 종료 조건을 명확하게 한다. 루프를 종료하기 위해서 for 루프의 인덱스를 조작하지 않는다. 루프 인덱스의 마지막 값에 의존하는 코드를 피한다. while 루프에서 bo..
두번째 직장. 본사는 송파였지만, 연구소장님의 독특한 취향으로... 안드로메다 옆 산속 연구소에서 반년 나무들과 맑은 공기, 새들이 노래하고, 사슴 뛰어 놀것 같지만 현실은 벌래 월드 수면실 매일 같이 쥐며느리에, 베리 빅 나방 간간히 꽃뱀, 왕지네 어떻게 살아남았냐... 일찌감치 사용하던 PDA 럭시앙, 흡연자들을 방어하기 위한 공기 청정기 그리고 업무용 카메라 청평 생활의 즐거움, 손님오는 날 어서오세요. 고기 사오셨나요? 여기서부터는 멤버 소개 꼬리치레 도롱뇽 연구소 옆 계곡에서 씻던 상추위로 뛰어들어서 합류 귀여운 놈... 깜박하고 외근? 나갔다가 한달 후에 돌아왔을 때 까지 빈속으로 버티던 근성 가이 잘 먹이고, 자연으로 퇴사 처리 도롱뇽 성체와 올챙이, 꼬리치레 때문에 소외된 친구들 산메기 깊..
printf( " \n", ( input_value?"aaa":"bbb" ) );
현재 디렉토리 내에 파일들의 절대 경로를 출력 ls | gawk "BEGIN {\"pwd\" | getline cwd} {printf(\"%s/%s\n\", cwd, \$0)}"
14: 직선형 코드 구성하기 의존성이 분명한 코드 구성 의존성을 분명히 하기 위해서 루틴 매개변수를 사용 의존성이 분명하지 않은 부분은 주석으로 문서화 15: 조건문 사용 정상적인 경우를 else가 아니라 if 문 다음에 입력 4개 이상의 조건에 대해 CASE 사용
long long은 gcc에서 지원 cl (VC compiler)에서는 __int64를 사용 (%I64d 로 출력) 부동소수 사용에 문제가 없다면 long double도 가능
read, write와 기본적으로 동일하나, 다수의 버퍼의 데이터를 한번에 출력/기록 할 수 있다. Prototype int writev( int fd, struct iovec iov[], int iovcount ); int readv( int fd, struct iovec iov[], int iovcount ); struct iovec { caddr_t iov_base; // 버퍼의 시작 포인터 int lov_len; // 버퍼의 바이트 사이즈 } struct iovec iov[3]; iov[0].iov_base = buf1; iov[0].iov_len = strlen(buf1); iov[1].iov_base = buf2; iov[1].iov_len = strlen(buf2); iov[2].iov_ba..
ref. Advence Linux System Network Programming fork 부모(parent)와 자식(child) 프로세스로 분기. fork로 프로세스가 복제될 때 자식 프로세스가 상속받는 것들은 메모리 영역과 파일 기술자, 시그널 마스크 등과 같은 정적인 자원들이다. wait/waitpid로 자식 프로세스의 리턴값을 확인 할 수 있다. fork의 리턴값 0 : 자식 프로세스에게 리턴 0 > : 부모 프로세스에게 리턴되며, 자식 프로세스의 PID 부모 프로세스 ..
매개변수(parameter) Prototype에 표시된 변수 리스트 int open( int A, char B ); 인수(argument) 함수 호출 시 사용하는 실제 입력 값 ret = open( 12, 'a' );
__STRICT_ANSI__ : ANSI C 규격으로 작동 (-ansi) _ISOC99_SOURCE : C99 표준을 지원 (-std=c99) _POSIX_SOURCE : POSIX 표준을 의미, == 1 : _POSIX_SOURCE >= 2 : _POSIX_SOURCE + IEEE std 1003.2 >= 199309L : IEEE std 1003.1a-1993 >= 199506L : IEEE std 1003.1b-1995 >= 200112L : IEEE std 1003.1-2001 _XOPEN_SOURCE : POSIX와 XPG 4.2(SUSv1) 표준 지원 < 500 == 500 : SUSv2(UNIX98) == 600 : SUSv3(SUS2002) _XOPEN_SOURCE_EXTENDED : X/..
구조체 데이터 관계를 이해하기 쉽게 하기 위해서 구조체를 사용 포인터 메모리 상의 위치 (32bit) 메모리의 내용을 해석하는 방법 (type) 포인터 오류의 빠른 발견이 중요 포인터를 선언과 동시에 정의 포인터를 할당된 곳과 같은 영역 내에서 삭제 dog-tag 필드의 사용 start-bit와 end-bit를 사용할 수 있으며 dog-tag는 포인터 영역의 상태를 표시 여분의 포인터 변수를 사용 포인터 연산을 단순화시킴으로써 발생하는 성능 향상 연결 리스트나 서로 다른 깊이의 포인터들을 올바른 순서로 삭제 경우에 따라 임시 메모리를 유지하여 메모리 부족시에 이용 중요한 데이터는 메모리를 해제하기 전에 쓰레기 데이터(0xcc)로 덮는다. wapping function 사용 메모리를 삭제하거나 해제한 다음..
명명된 상수 매직 넘버(magic number)를 피한다. 매직 넘버는 100이나 47524와 같이 아무런 설명도 없이 프로그램 한가운데 나타나는 리터널 숫자이다. (문자열도 마찬가지) named constant를 이용하며, 필요하다면 1, 0은 그냥 사용한다. 정수 곱셈으로 인한 정수 오버플로우에 주의한다. 아래는 정수의 표현범위 이다. 정수형 범위 부호 있는 8비트 -128 ~ 127 부호 없는 8비트 0 ~ 255 부호 있는 16비트 -32,768 ~ 32,767 부호 없는 16비트 0 ~ 65,535 부호 있는 32비트 -2,147,483,648 ~ 2,147,483,647 부호 없는 32비트 0 ~ 4,294,967,295 부호 있는 64비트 -9,223,372,036,854,775,808 ~ ..
warning: comparison is always false due to limited range of data type gcc에서 아래와 같은 코드가 해당 경고를 발생시킬 수 있다. unsigned char btFlag; ... if ( btFlag < 0 ) btFlag는 unsigned 이므로 항상 false 이다. 무심코 넘어갈 수 있는 부분
문제 지향성(Problem Orientation) 기억하기 쉬운 이름은 일반적으로 해결책보다 문제에 대해서 말한다. 좋은 이름은 "어떻게" 보다 "무엇"을 표현하는 경향이 있다. 일반적으로 이름이 문제보다 해결 과정의 어떤 측면을 가리키고 있다면, 이는 "무엇" 보다는 "어떻게"에 대한 것이다. 문제 자체를 가리키는 이름을 사용하도록 한다. 변수 이름의 일반적인 반의어들 begin/end first/last locked/unlocked min/max next/previous old/new opened/closed visible/invisible source/target source/destination up/down 전형적인 불린 변수의 이름 done 무언가 수행되었다는 것을 가리키기 위해서 done을 ..
원문: http://msdn.microsoft.com/ko-kr/library/9s7c9wdw(VS.80).aspx 컴파일러 옵션 범주별 목록 다음은 범주별로 나열한 포괄적인 컴파일러 옵션 목록입니다. 최적화 옵션 용도 /O1 작은 코드를 만듭니다. /O2 빠른 코드를 만듭니다. /Ob 인라인 확장을 제어합니다. /Od 최적화를 사용하지 않습니다. /Og 전역 최적화를 사용합니다. /Oi 내장 함수를 생성합니다. /Os 코드 크기를 우선으로 합니다. /Ot 코드 속도를 우선으로 합니다. /Ox 최대 최적화(/Ob1gity /Gs)를 사용합니다. /Oy 프레임 포인터를 생략합니다. x86 전용입니다. 코드 생성 옵션 용도 /arch 코드 생성 시 SSE 또는 SSE2 명령을 사용합니다. x86 전용입니다...
warning: no newline at end of file gcc에서 소스의 마지막 라인을 빈줄로 남겨두지 않으면 발생한다. 소스코드가 다른 유틸에 넘겨질 때 발생하는 문제를 막기위해서 라는데... 정확히 어떤 경우인지 잘 모르겠는 중-_-; 알려주시면 감사 :)
데이터 사용 능력 테스트 친숙한 용어 옆에 1점을, 알지만 확신할 수 없다면 0.5점을 입력한다. ___ 추상 데이터 형 ___ 배열 ___ 비트맵 ___ 불린 변수 ___ B-트리 ___ 문자 변수 ___ 컨테이너 클래스 ___ 배 정도 ___ 연장 스트림 ___ 열거 형 ___ 부동소수점 ___ 힙 ___ 인덱스 ___ 정수 ___ 연결 리스트 ___ 명명된 상수(named constant) ___ 리터럴(literal) ___ 지역 변수 ___ 참조 테이블 ___ 멤버 테이터 ___ 포인터 ___ private ___ 소급 시냅스(retroactive synapse) ___ 참조 무결성 ___ 스택 ___ 문자열 ___ 구조적 변수 ___ 트리 ___ typedef ___ union ___ 값 체인..
게으름 재미없는 작업을 다시 수행할 필요가 없도록 툴을 작성하는 것 지적인 정직함 전문가가 아님에도 전문가인 것처럼 행동하지 않는 것 실수를 기꺼이 인정하는 것 오류 메시지를 막기보다는 컴파일러 경고를 이해하기 위해서 노력하는 것 작동하는지 확인해 보기 위해서 컴파일을 하기보다는 프로그램을 명백하게 이해하는 것 현실적인 일정표를 제공하고 관리자가 일정을 조절할 수 있는지 물었을 때 자신의 입장을 지키는 것 어떤 바보라도 자신의 실수에 대해서 정당성을 주장할 수 있으며 대부분의 바보들이 그렇게 한다.
저는 주석이 책의 표제나 목차와 같기를 바랍니다. 주석은 올바른 섹션을 찾는 데 도움을 주며, 그 다음부터 코드를 읽기 시작합니다. 프로그래밍 언어로 작성된 20줄의 코드를 읽는 것보다는 영어로 작성된 한 문장을 읽는 것이 훨씬 빠릅니다. .... 마치 당신들은 한 번도 다른 사람이 작성한 코드를 수정해야 했던 적이 없었던 것처럼 들리는군요. 저는 제가 바꿔야 하는 두 줄짜리 코드를 찾기 위해서 엄청나게 집중해서 수 백 줄의 코드를 읽을 필요는 없다고 생각합니다.
한 줄에 지나치게 많은 연산을 수행 strcpy( char * t, char * s ) { while ( *++t = *++s ); } strcpy( char * t, char * s ) { do { ++t; ++s; *t = *s; } while ( *t != '\0' ); } t 와 s 는 *s 가 *t 에 복사되기 전에 증가, 첫 번째 문자가 빠진다. 5,000,000 문자열을 복사할 때 첫 번째 버전은 4.81초, 두 번째 버전은 4.35초가 걸렸다. 이 경우에서는 "머리를 굴린" 버전이 11% 정도 속도가 느렸으며, 결국 쓸데없이 머리를 굴린 꼴이 되었다.
이전 버전의 VS(6.0)에서 작성한 프로젝트를 상위 버전 VS로 컴파일하면 WINVER not defined. Defaulting to 0x0501 메시지가 출력된다. StdAfx.h 파일 상당에 다음과 같이 정의해 주자. #define WINVER 0x0501 // 2003의 경우