getch 와 _getch

from Study/C언어 2007/03/14 09:12 view 25949

ANSI C에서 정의한 함수가 getch이고 VC++ 컴파일러 에서 지원하는 함수가 _getch이다.

굳이 표준 외에 함수를 만든 이유가 무엇일까 생각해봤는데

#include <conio.h>
#include <stdio.h>

void main( void )
{

   /* Display message until key is pressed. */
   while( !_kbhit() )
      _cputs( "Hit me!! " );

   /* Use _getch to throw key away. */
   printf( "\nKey struck was '%c'\n", _getch() );
   _getch();
}

만약에 이 소스에 getch라는 변수를 추가 했을때 getch()함수를 사용했다면

error C2064: term does not evaluate to a function

와 같은 에러를 볼 수 있다. 이를 방지 하기 위해서 '_'를 붙인 함수를 만든건 아닐까라는

생각이 든다. 그래서 변수명앞에 '_'를 사용하는 것을 금하는 거 아닐까-_-..

터보C(TurboC.h )

from Study/C언어 2007/03/13 18:52 view 24247

출처:http://winapi.com 

커서의 움직임을 보다 효율적으로 하기 위해 TurboC.h을 제작한 것 같다.

이를 사용하면 cmd창내에서의 커서를 간편하게 제어할수 있다.

웬만한 해더파일을 전부 포함시켜 놓았다.
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <time.h>
#include <windows.h>

커서의 사이즈와 타입을 위해 선언해 놓았다.
typedef enum { NOCURSOR, SOLIDCURSOR, NORMALCURSOR } CURSOR_TYPE;
void setcursortype(CURSOR_TYPE c);

화면을 command명령어인 cls를 이용하여 초기화 해준다.
void clrscr();

커서의 좌표를 매개변수로 입력하여 원하는곳에 goto해준다.
void gotoxy(int x, int y);

커서의 현재좌표를 구하는 함수이다.
int wherex();
int wherey();

#define delay(n) Sleep(n)       // n/1000초만큼 시간 지연

rand함수만을 호출 할경우 매번 똑같은 난수가 발생 하므로 time함수와 srand함수를 이용하여  난수의 초기값을 매번 다르게 해준다.
#define randomize() srand((unsigned)time(NULL))  // 난수 발생기 초기화
#define random(n) (rand() % (n))     //0~n까지의 난수 발생

3.13(화) float와 __int64

from Study/C언어 2007/03/13 18:21 view 21076
VC++6.0 컴파일러가 지원하는 자료형중에 __int64라는 게 있다. 뭔지 한번 살펴봤더니.

The types __int8, __int16, and __int32 are synonyms for the ANSI types that have the same size, and are useful for writing portable code that behaves identically across multiple platforms. Note that the __int8 data type is synonymous with type char, __int16 is synonymous with type short, and __int32 is synonymous with type int. The __int64 type has no ANSI equivalent.

표준규격은 아니란다. 그럼 왜 만들어놨을까..

int형으로 표현할수 있는  정수는 42억정도까지 있다. 근데 이보다 더 큰 수를 쓰고 싶다면

어쩔수 없이 float형을 사용하여 표현 할 수 있는데 이는 처리속도에 지장을 준다.

CPU는 쓸모 없는 소숫점이하의 수를 연산하게 되는 것이다. 이를 위해 __int64라는 자료형이

생겼다고 하는데 효율성이 얼마나 좋을지는... 이런거 테스트해보는 구문이 있었는데

나중에 생각나면 한번 해봐야 하지 않을까..

예전에 두수를 연산할때 되도록 '/'연산자를 쓰면 몇번의 연산을 더 필요로 하기 때문에

다른 방법으로 하느것이 프로그램의 동작속도를 빠르게 한다고 했었는데 그거와 비슷한 것
 
같다. Shift연산자를 사용하면 된다. >> , << 곱하기 나눗셈 대신에 요고 이용.

3.13(화) bit와 메모리에 관해서..

from Study/C언어 2007/03/13 17:42 view 17470

 키워드와 식별자에 대한 강의는 대충 끝났다. 기존에 알고 있는 것들 이었지만 기초는

언제나 중요한 법이니깐 그리고 내 기억력이 3일(?)이라 왠지 새롭다.

2^10은 1024 즉 1KB라는건 왠지 중요한 척도 이다. 이 숫자만 알고 있다면 32비트던 16비트던
대충 감이 온다는 것이다. 16비트는 2^16이므로 2^10*2^6으로도 표현 가능하고 즉 64KB라는

답이 바로 나오는 것이다. 이 64KB는 메모리를 참조할때 한번에 처리(?)하는 범위가 된것이

다. 아.. 그리고 16비트는 2바이트이므로 int형이나 포인트형 변수는 2바이트를 가지게 된다.

32비트도 마찬가지로 2^32이므로 2^30*2^2, 즉 한번의 클럭에 4GB라는 어마어마한 처리속도

 

가지게 되었다. 하지만 이는 이론적 수치이고 RAM과 CPU간의 전송속도를 맞추기위해

1~2MB
정도의 처리를 한다고 한다.


32비트에서는 포인터형과 int형이 4바이트를 가지게 되고 64비트에서는 int형은 호환성의
 
문제때문에 그대로 유지하고 포인트형은 64비트의 모든 주소값을 표현하기 위해

(그럴리는 없지만-_-..1800경??) 8바이트로 바뀔것이라 한다. 이미 바꿧나??

근데 빠른처리속도와 효율적인 메모리공간관리는 비례할 수 없나..


잘 몰라도 지금의 넉넉한 하드웨어적 환경이라면 메모리공간보다도 처리속도를 더 신경쓰느

게 좋은선택일 것 같다.

 계단식(처리비율??)으로 설계하여 CPU가 한번에 하나의 일을 처리하도록 설계하는 것이

하나의 방법이라는데 아직은 그 의미만 알 뿐이지 구현까지는 떠오르지는 않는다.

더 배우고 하다보면 "아하" 라는 느낌을 받기를 바라며..

3.13(화) scanf 를 보면서..

from Study/C언어 2007/03/13 14:30 view 18887
 듀얼 모니터를 쓰기 위해 LCD모니터 하나를 학원에 가져 왔다. 아침 7시에 와서 그런지
지하철에서도 편히 왔고 거리도 한적한 모습이었다.

 scanf 를 쓸때 %d를 입력받고 %c를 쓰게 되면 버퍼에 남아있던 줄바꿈(?)이 남아 있기 때문에 문제가 되곤 하는데 여러 해결방법이 있는데 무엇이 좋은지는 아직 모르겠다.

1. scanf("%d",..);   scanf(" %c",..);      //서식 문자사이를 한칸띠어서 하는 방법.
2. scanf("%d",..);   scanf("\n%c",..);  //서식 문자앞에 \n를 써서 해결.
3. scanf("%d%*c",..); scanf("%c", ..); //%*c를 써주는 방법.
4. fflush(stdin); //입력버퍼를 비워주고 다시 입력 받는 방법.

3.12(월) 첫걸음

from Study/C언어 2007/03/12 17:50 view 20894

 2주 늦춰진 개강날이지만 제대로 준비도 못하고.. 무거운 발걸음으로 지하철을 탔다.

비록 신림역에서 강남역까지 30분거리지만 지옥철이라고 듣던 서울의 출근길 지하철을 처절

하게 몸으로 느껴 주시고 무난히 학원에 찾아갔지만 학원 첫인상은 화장실에서 밤새듯한

모습을 하신 분께서 양치질 하는 모습과 누군가가 먹다 만 맥주피트병(약?)이 강의실에 있는 것이

꾸밈이 없다고 해야 할까..

"유저에게 뒤쳐지면 좋은 프로그래머가 될 수 없다."
"잘하는 사람은 더 열심히 하는데 잠을 줄이고 모든 시간을 프로그래밍에 투자해라."

첫날이라 그런지 장달상강사님이 무언가 공부하고자 하는 계기를 심어주고자 하시는 듯
 
했다. 나도 서울까지 올라와 무언가는 배우고 가자는 마음도 있고 잘하는 사람과의 격차도

줄여보자는 마음은 산더미인데 강사님 말대로 작심삼일을 수백번 반복해봐야 할려나..

그나저나 옆에 건물 공사소리가 신경쓰이네.


Tag |

내가 지금 잘하고 있나..

from Book/읽은 책 2007/02/11 03:43 view 24871

 아직 배워야 할것도 고쳐나가야 할것도 많다. 그냥 뭔가 기분전환 하고 싶어 읽은 책.

사용자 삽입 이미지

Tag |

DOSBOX 사용하기

from Info/Tools 2007/02/11 03:31 view 23229

cmd 에서는 예전 도스 게임을 완벽히 지원하지 못하는 것 같다.

남북전쟁 할려고 했더니 시작이 제멋대로 되고 난리도 아니다.

그래서 DOSBOX 라는 일종의 도스창을 개발해 놓았다.(http://ykhwong.x-y.net)

인스톨 후 z:)라던가 명령창이 뜨면 " mount c d:/" 를 입력하여 원하는 폴더를

기본폴더로 만든다. 그리고 나서 "c:" 기본폴더로 이동하여 도스게임 시작!!

'man'이라는 명령을 이용하여 도움을 받을 수 있다.

$> man errno

'ERRNO(3)' 이라고 표시 되는데 괄호 안에 있는 번호는 맨 페이지의 섹션 번호를 나타낸다.

즉, ERRNO에 대한 설명은 맨페이지의 세 번째 색션에 있다는 것이다.

섹션이란 유닉스 상에서 필요한 도움말들을 종류별로 구분해 놓은 것이다.

1번 섹션은 쉘에서 실행하는 일반 프로그램들에 대한 도움말을 다룬다.

2번 섹션은 시스템 콜에 대한 것이다.

3번 섹션은 라이브러리 함수에 대한 것이다.

이밖에도 총 아홉 개의 섹션이 존재한다.

시스템 콜 'write'를 찾고 싶은 경우는 반드시 다음과 같이 섹션을 명시해 주어야 한다..

$> man 2 wirte


Tag |
gcc
-o 실행파일의 이름을 지정하는 옵션. ex) gcc -o first first.c
-c 소스 코드를 컴파일만 하고 링크하지 않기. ex) gcc -c first.c
컴파일과 링크 : 오브젝트 코드는 단지 소스 코드의 내용을 컴파일 한것이다. 링크 과정은 여러개의 오브젝트 파일을 연결하여 완성된 프로그램으로 만들어 준다. 소스 코드에서 사용된 printf()나 scanf()와 같은 라이브러리 함수들도 링크 과정을 통해 프로그램과 연결된다.
-c 옵션을 쓰는 이유 : 프로그램이 조금만 커져도 나누어 관리하는 것이 훨씬 편리하기 때문이다. 또한 하나의 소스 파일만 바뀌었을 때 모든 소스 파일들을 다시 컴파일하지 않아도 되기 때문에 오브젝트 코드를 가지고 링크를 한다.
-I

특정 디렉토리에 있는 헤더를 추가로 검색하는 옵션
ex) gcc -I/user/src/include

-L 라이브러리를 찾을 때 검색할 디렉토리를 추가해주는 옵션
Tag |