돌고 도는 구조체를 어떻게 선언해야 할까요? 자기 자신을 포인터하는 구조체를 선언하는 방식이 바로 구조체전방선언이라고 불리우는 불완전 선언입니다. 아래 예제를 보도록 하겠습니다. 먼저 다음과 같이 불완전 선언부터 해야 합니다. typedef struct Activity_ Activity; typedef struct Context_ Context; typedef struct Context_ { bool refreshRequired; Activity *activity; Location *location; Menus *menus; }Context_; typedef void (*OnClickFunction)(Context *context); typedef void (*OnScreenFunction)(Contex..
C언어에서 아주 중요한 static의 활용을 알아 보도록 하겠습니다. 여러 사람이 함께 작업하는 프로젝트에서는 static을 적절히 사용해야 합니다. static 으로 선언한 사용하지 않는 함수나, 전역변수를 컴파일러에서 warning해주기 때문에 아주 유용합니다. 아시겠지만 컴파일러에서 error를 발생하면 타킷 보드에 프로그램을 로딩할 수없습니다. 그러나 warning이 발생하면 로딩이 가능하기 때문에 무시하는 경우가 많은데, 이는 런타임시에 에러를 발생 할 수 있으므로 warning도 없으주는 것이 좋습니다. static은 여러개의 파일내에 해당 파일 scope로 동일한 이름의 함수를 만들 수 있게 해줍니다. 예를 들어 보겠습니다. 여러개의 .c 파일을 만들어 봅시다. Uart.c, Lcd.c, F..
1. typedef 는 데이터형을 만드는 명령어 입니다. C패턴을 이용하려면 반드시 알아야 합니다. 간단하게 다음과 같이 사용할 수 있습니다. typedef unsigned char u8; u8 i = 0; //unsinged char i = 0과 동일 2. 콜백 함수도 typedef를 이용해서 만들 수 있습니다. typedef void (*timer_handler)(s8 timer_id, u32 param1); s8 register_timer(u32 period, timer_handler handler) { ... } 3. firmware 개발시 8bit, 16bit, 32bit MCU를 개발하다 보면 애초에 형 지정을 잘못해서 모든 소스를 뒤져 수정한 경험이 있으실 지도 모르겠습니다. 특히 int, ..
Enum(열거형)은 변수가 아니라 값의 정의입니다. typedef를 해서 사용하면 편리합니다. 우선 #define과 비교하자면, #define zero 0 i = zero; 여기에서 i 에는 0이 할당됩니다. zero가 0으로 치환 됩니다. 말 그대로 문자 바꾸기를 컴파일러에서 해주는 것에 불과합니다. enum과 typedef를 같이 사용해 봅시다. typedef enum { RED, GREEN, PUCE }colors_t; colors_t favorite = PUCE; C언어에는 없는 bool type을 만들 어서 다음과 같이 사용 할 수도 있습니다. typedef enum { false=0, true=1 }bool; bool isTrue = false; 위와 같이 사용하면 false는 0, true는..
프로그램 런타임시에 발생하거나 발생가능한 에러상황을 미리 예견할 수 있다면 얼마나 해피할까요? 이러한 냄새를 100% 맡을 수는 없지만, 적절한 기법을 사용하면 에러 확율을 줄일 수 있습니다.그 기법에 중에 하나가 assertion입니다.일반적으로 변수나 포인터에 원치 않는 값이 들어가도 이상없이 실행이 되거나, 혹은 hard fault가 발생됩니다. 이런 상황이 되면 어디에서 에러가 발생한 줄 모르거나 아예 발생한 줄을 모르는 경우가 생길 수도 있습니다.이럴경우를 대비해서 기본적으로 다음과 같이 코딩을 할 수 있다. 물론 언어나 컴파일 환경에 따른 차이가 존재합니다. void main(void) { Register(NULL); } void Register(Handler handler) { assert(..
[네이버 지식백과]template method 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 한빛아카데미(주)) 템플릿 메소드 패턴도 유용한 패턴입니다. 기능은 같으나 구현방법이 다른 메소드들의 구조를 제시하고 기능과 구현방법이 같은 메소드는 대표로 하나만 제시하는 방법입니다. 예를 들어 도형을 그리는 것을 생각해보도록 하겠습니다. 도형에는 삼각형, 사각형, 원 등이 있습니다. 넓이와 높이(원의 경우 지름)을 통해 도형을 설정하는 것은 모두 똑같습니다. 그러나 구체적으로 모양은 다르지요. 이러한 도형을 그릴때는 메모리라는 사상위에 비트를 역상시켜 해당 도형을 그리는 방법은 어느 이미지든 동일합니다. 따라서 도형의 모양을 만드는 기능은 개별 구현이 가능하도록 추상메소드로 하고 그리는 부분..
[네이버 지식백과] strategy 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 한빛아카데미(주)) 스트레티지 패턴은 아주 단순하면서도 여러가지 패턴중에 가장 유용한 패턴입니다. 사용법은 아주 간단합니다. 우선 interface를 만들고 원한는 때에 콘크리트 코드를 치환해서 사용하면 됩니다. 적절한 예제일지는 모르지만, 특정한 상황에서 uart를 spi로 변경하는 드라이버 예제를 보도록 하겠습니다. 먼저 interface를 구현해보도록 하겠습니다. open, close, read, write 네가지를 만들었습니다. 필요하면 더 만들어도 되구요. read, write에는 addr 파라메타가 있는데, 혹시 메모리 접근시에 필요할 지도 몰라 넣었습니다. 물론 필요없으면 구현시에 사용하지 않..
[네이버 지식백과]observer 패턴 (쉽게 배우는 소프트웨어 공학, 2015. 11. 30., 한빛아카데미(주))Observer 패턴은 정말 많이 사용하는 패턴입니다. 자바 프레임워크에서도 쉽게 찾을 수 있습니다. 우리가 흔히 쓰는 Java C#에서 Event Listener 들이 이 종류에 속하지요.Observer pattern을 예제를 위해서는 observer_t: 관찰자 Structure calculate_temperature : 온도를 측정하는 루틴 display_degree_handler : 화면에 측정된 온도를 표시하는 루틴 file_write_degree_handler : 파일에 측정된 온도를 표시하는 루틴 우선 헤더를 보겠습니다.observer_handler_t 가 바로 관찰자 콜백함수..