배열의 내부적 처리
 C에서 다차원 배열이란 1차배열의 연장선을 말한다. 내부적으로는 하나로 쭉 연결된 구조이다. 하지만 부분 배열이 온전하게 배열로 대접받는다

#include <Turboc.h>

void arDump(void *array, int length);

void main(void)
{
	unsigned char ari[2][3] = {{1,2,3},{4,5,6}};

	arDump(ari, sizeof(ari));
	arDump(ari[0], sizeof(ari[0]));
	arDump(ari[1], sizeof(ari[1]));
}

void arDump(void *array, int length)
{
	int i;
	for(i=0;i<length;i++){
		printf("%02X ", *((unsigned char *)array+i));
	}

	printf("\n");
}
결과

01 02 03 04 05 06
01 02 03
04 05 06

ari[0], ari[1] 라는 부분 배열이 배열명으로 인정되며 부분 배열 혼자만 떼어내서 사용하는 것이 가능하다. ari[0]는 배열의 이름이기 때문에 부분 배열의 시작 번지를 가리키는 포인터 상수이며 따라서 arDump 함수로 전달할 수 있다.
수학함수는 수학적인 계산을 하는 함수들이다.

double sin(double x);
double cos(double x);
double tan(double x);
double asin(double x);
double acos(double x);
double atan(double x);
double sinh(double x);
double cosh(double x);
double tanh(double x);


asin, acos, atan 기본 삼각 함수의 역함수이며
sinh, cosh, tanh는 쌍곡선 삼각함수이다.

삼각함수가 받아들이는 인수 x는 360분법의 각도가 아니라 호도(라디안)값이다.

라디안(호도) : 1호도는 원주의 길이가 반지름과 같아지는 각도인데 180/3.1416으로 정의 되어 있다.

호도 = 각도 * 3.1416/180



반지름 r 과 r의 길이가 같아지는 정도..? 잘 모르겠다.  일단 0~90도까지 값이 어떻게 나오는지 봐야겠다.
예제를 한 번 돌려 보았다.

#include "Turboc.h"
#include "math.h"

void main(void)
{
	int r;

	for(r=0;r<=90;r+=10){
		printf("sin(%d도)=%f\n",r,sin(r*3.1416/180));
	}
}
결과
sin(0도)=0.000000
sin(10도)=0.173649
sin(20도)=0.342021
sin(30도)=0.500001
sin(40도)=0.642789
sin(50도)=0.766046
sin(60도)=0.866027
sin(70도)=0.939694
sin(80도)=0.984808
sin(90도)=1.000000


염병.. 90도일때 1라디안이랑 가까워지는 구나.. 어찌라고?? 단순무식한 나에게는 한계인가? 무엇을 만들수 있을까 시계와
같은 것을 만들때 꼭 필요하다고 하다. 

#include "Turboc.h"
#include "math.h"

void main()
{
	double angle;
	int x=-1,y=-1;

	clrscr();
	gotoxy(40,12);
	putch('S');
	for(angle=0;;angle+=10){
		if(angle==360) angle=10;
		//if(kbhit()) break;
		gotoxy(40+x,12+y); 
		putch(' ');
		x=int(cos(angle*3.1416/180)*20);
		y=int(sin(angle*3.1416/180)*10);
		gotoxy(40+x,12+y); putch('E');
		delay(100);
	}
}



이런걸 만들 수 있다. 와우 신기하구나... 꿀꺽


 기억 부류 전역  지역  정적  레지스터 
 지정자  extern auto  static  register 
 저장 장소 정적 데이터 영역 스택  정적 데이터 영역  cpu의 레지스터 
 선언 위치 함수의 외부  함수의 내부  함수의 내부  함수의 내부 
 통용 범위 프로그램 전체 함수의 내부  함수의 내부  함수의 내부 
 파괴 시기 프로그램 종료시 함수 종료시 프로그램 종료시  함수 종료시 
 초기값 0으로 초기화 초기화되지 않음 0으로 초기화 초기화되지 않음 

외부변수 예제 (extern)
#include <Turboc.h>

int before = 11;

void main()
{
	extern int before;
	extern int after;

	printf("befere=%d, after=%d\n", before, after);
}

int after = 22;

main 안에 extern을 선언하여 before, after가 함수 바깥의 어딘가에 선언되어 있다고 알게된다
extern은 생략이 가능하다. 결국 같은 모듈 안에서는 별로 쓸모가 없다.

extern이 꼭 필요한 경우는 전역변수가 다른 외부 모듈에 선언되어 있을 때이다.

 #include <Turboc.h>

void main()
{
      printf("value is %d\n", value);
}
int value = 1234;




 extern.cpp  global.cpp

extern.cpp가 컴파일 될 때 어디인가 선언되어 있다고 알려준다.
1.값에 의한 호출 (call by value)

#include "Turboc.h"

int plusone(int a);

void main()
{
	int i,j;

	i=5;
	j=plusone(i);
	printf("i=%d, 결과=%d\n", i,j);
}

int plusone(int a)
{
	a=a+1;
	return a;
}

i=5 결과=6

2.참조 호출 (call by reference)

#include "Turboc.h"

void plusref(int *a);

void main()
{
	int i; 
	i=5;
	plusref(&i);
	printf("결과=%d\n",i);
}

void plusref(int *a)
{
	*a = *a + 1;
}
a의 승을 구하는 함수
power(2,10) == 1024
표준함수의 원형을 미리 작성해 놓은 것을 헤더파일이라고 한다. 대표적인 것이 stdio.h

 헤더파일  함수  예
 stdio.h  표준입출력에 관한 함수  printf, scanf, puts
 conio.h  키보드 및 화면 입출력 함수  getch, cprintf, kbhit
 stdib.h  자료 변환 함수들  atoi, itoa, malloc, free
 math.h  수학 함수들  sin, cos, log
 string.h  문자열 조작 함수들  strcpy, strlen

모듈 프로젝트 소스를 여러개 나눠서 헤더파일을 통해서 각각의 기능을 합칠 수 있다.


Game.cpp는 헤더파일을 포함으로써 개별적으로 컴파일 되어 링커에 의해 하나의 실행 파일로 합쳐진다.
함수의 원형은 과연 무엇일까? 그보다  프로그래밍 언어 해석 방식을 알아야 한다.

컴파일방식 : 실행 전 소스를 읽어 기계어로 한꺼번에 번역
인터프리터방식 : 실행하면서 기계어로 번역 

컴파일 방식은 소스를 차례대로 읽어가는 방식이다. C언어도 컴파일 방식임

main 
함수

이런 방식으로 선언하였을 경우 main에서 함수를 실행시 에러가 난다.

함수 
main  

할 경우 에러가 나지 않는다. 

이런 경우를 대비해 함수의 원형을 미리 선언해 둘 수 있다. 

#include "Turboc.h"

int Max(int a, int b);

void main(){
	
	int a, b, m;

	printf("두 수를 입력하세요 : ");
	scanf("%d%d", &a,&b);
	m=Max(a,b);
	printf("두 수 중 큰 값은 %d입니다.\n", m);
}

int Max(int a, int b)
{
	if(a > b){
		return a;
	}else{
		return b;
	}
}
#include "Turboc.h"

char Dec2HexChar(int d)
{
	if(d >= 16){
		return '?';
	}

	printf("%d, %d, %d\n", d , d + '0', d > 9);

	return d+'0'+(d>9)*7;
}

void main()
{
	int input;

	for(;;){
		printf("0~255사이의 수를 입력하시오(끝낼 때 -1) :");
		scanf("%d", &input);
		if(input == -1){
			break;
		}

		printf("입력한 수의 16진 표기 = %c%c\n",
			Dec2HexChar(input >>4), Dec2HexChar(input & 0xf));
	}
}
10진수를 16진수로 변환과정이다. 함수로 만들어넣고 참고한다. 앞의 비트와 뒤의 비트를 각각 넘기므로 한자리의 
16진수가 리턴된다.  그런데 d+'0'+(d>9)*7 과연 이것은 무엇일까? 생각했다. 

그러다 아스키코드 표를 보고 이해를 하게 되었다. 0은 아스키코드로 48을 나타낸다. 그래서 d로 넘어온 숫자면 그냥 더하면
 0  1  2  4  5  6
 48  49 50   51 52  53  54  55  56  57 

이렇게 순서대로 보여지게 된다. 

그렇다면 (d>9)*7은 무엇일까. 아스키코드 57 즉 9 이후에는 특수문자가 7개 이후에 
 A B
65   66 67   68 69   70  71  72 73  74 

즉 9이상 클경우에는 영어로 표현되기 때문에 9이하는 0*7이 되서 아무것도 안 되지만 9 이상일경우 7을 더해 영어를 표현하였다. 


+ Recent posts