728x90

구구단 3단 소스 (http://codepad.org/ZT1RrUn5)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>

int main()
{
	int iCnt;
	iCnt=1;  // 아래 소스에서 for 함수로 정리 ⓐiCnt=1;
	
	while(10>iCnt) // for 함수 정리ⓑ(10>iCnt);  
	{
		printf("3 x %d = %d\n", iCnt, 3*iCnt);
		iCnt=iCnt+1;  // for 함수 정리ⓒiCnt=iCnt+1
	}
	return 0;
}
 


iCnt=iCnt+1


iCnt=++iCnt;


iCnt=iCnt++


을 위의 소스에 대입해도 모두 같은 결과 값을 얻을 수 있지만 첫번째가 권장된다.


처리속도는 동일하기에 소스를 짤 때 인간(프로그래머)이 보기에 헷갈리지 않게, 

보기 편하게 소스를 짜는 것이 좋다. 




이제 위의 소스를 for 함수를 사용해 정리해보자 (http://codepad.org/NhNOP5Qt)

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>

int main()
{
	int iCnt;
		
	for(iCnt=1;10>iCnt;iCnt=iCnt+1)
	{
		printf("3 x %d = %d\n", iCnt, 3*iCnt);
	}
	return 0;
}



for (); 




for ()

{

}




for () {}


모두 같은 값을 얻을 수 있다.




두 소스 모두 output이 동일하다.


Output:

1
2
3
4
5
6
7
8
9
3 x 1 = 3
3 x 2 = 6
3 x 3 = 9
3 x 4 = 12
3 x 5 = 15
3 x 6 = 18
3 x 7 = 21
3 x 8 = 24
3 x 9 = 27




volatile 변수


volatile 휘발성의


1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
int main()
{
 volatile int iCnt;  // volatile = 휘발성의
 for(;;) // = while(1)
 {
   for(iCnt=0;100000000>iCnt;iCnt=iCnt+1)
  { }
  printf("test\n");
 }
 return 0;
}



바로 위의 소스에서 volatile 변수를 쓰지 않는다면 CPU의 register내에서 모두 연산하고 Memory에 값을 저장하는 내부 최적화를 진행한다.


컴파일러가 자체적으로 메모리 접근을 최소화 시키는 것이다.


volatile은 이런 최적화를 하지않게 선언해서, CPU가 "매 값마다" 참/거짓을 판별, 연산하고 

메모리에 저장하고 가져오는 과정을 반복하게 한다.


명령창에서 실행해보면 volatile 변수를 쓴 것과 쓰지않은 것의 차이를 눈으로 확인할 수 있다.





UNION


여러 종류의 변수들을 같은 메모리 공간에 묶는다.


예제 소스 (http://codepad.org/vSaMCGCW)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

struct smart
{
    int A;
    short B;
    int C;
    char D;
};

int main()
{ 
    printf("Size of Smart: %d\n", sizeof(struct smart));
    
    return 0;
}


Output:

1
Size of Smart: 16




smart구조체를 UNION으로 수정 (http://codepad.org/rDFsMFkY

#include <stdio.h>

union smart 
//struct smart
{
    int A;
    short B;
    int C;
    char D;
};

int main()
{
    union smart obj;
    obj.A=0x12345678;
    obj.B=0x12345678;
    obj.C=0x12345678;
    obj.D=0x12345678;
 
  //printf("Size of Smart: %d\n", sizeof(struct smart));
    printf("Size of Smart: %d\n", sizeof(union smart));

    printf("%x\n", obj.A); 
    printf("%x\n", obj.B); 
    printf("%x\n", obj.C); 
    printf("%x\n", obj.D); 

    return 0;
}



Output:

1
2
3
4
5
Size of Smart: 4
12345678
5678
12345678
78


output 첫번째 줄을 보면 알 수 있듯이, size가 16에서 4로 바뀌었다.

smart 구조체를 union으로 바꿔주면 모두 4byte 안에 들어가게 된다. 

(int A; short B; int C; char D;)                         


각 데이터의 크기에 따라 각각 다른 값이 출력되게 되며, 다음과 같이 출력된다.


Little Endian

78 

 56

 34

 12


obj.A=12345678   // int A

obj.B=5678        // short B

obj.C=12345678  // int C

obj.D=78           // char D




함수 포인터를 사용하는 이유


①프로그램 코드의 간결


②중복 코드를 줄이기 위해서


③상황에 따라 해당되는 함수를 호출할 수 있음




type알아내기


type을 알아야 함수 포인터를 만들 수 있다.

아래와 같이 따라하면 원형에서 쉽게 type을 알아낼 수 있다.


1. void smart();   원형

2.        (*)

3. void (*) (); // void (*) ()가 type



int printf(const char *, ...);  // 원형

int (*)  (const char *, ...);  // Type



함수 포인터 예제 소스 (http://codepad.org/YiQTHzi9)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <stdio.h>
void smart1()
{
 printf("1번함수\n");
}
void smart2()
{
 printf("2번함수\n");
}
int main()
{
 void (*test)( );
 test=smart1;
 test( );
 test=smart2;
 test( );
 return 0;
}


Output:

1
2
1번함수
2번함수


type 이름; 


1. void (*test) ();

2. test=smart1; 

3. test();




반도체 (Semi Conductor)


반/도체

Semi/Conductor


도체

전기 또는 열이 잘 통하는 물체


부도체

전기 또는 열에 대한 저항이 매우 커서 전기나 열을 잘 전달하지 못하는 물체


반도체

극성에 따라 전기가 흐르거나 흐르지 않는다.



마이크로 컨트롤러 제품군 중의 하나인 "AVR"


AVR 개발환경, Intel과 AVR의 교차개발 환경 구축을 위해 둘 사이에 WIN AVR이라는 컴파일러를 사용한다. 이를 Cross Compiler라고 한다.

윈도우에 visual studio가 있다면 avr은 avr studio가 있다.


아키텍처의 종류

RISC 

CISC  


장단점이 각각 있지만, 서로 단점을 보완하며 닮아가고 있다.




'Study > C' 카테고리의 다른 글

2016-04-06-업무일지_포인터 및 함수  (0) 2016.04.06
20160405_포인터와 배열  (0) 2016.04.05
20160401_전역변수와 포인터  (0) 2016.04.04
20160329_C기초, 디버깅  (0) 2016.03.29
20160307_업무일지_파일 입출력  (0) 2016.03.07

+ Recent posts