구구단 3단 소스 (http://codepad.org/ZT1RrUn5)
#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)
#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이 동일하다.
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 휘발성의
#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)
#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;
} |
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 첫번째 줄을 보면 알 수 있듯이, 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)
#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;
} |
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 |