수학시험에서 대부분 답이 0 혹은 1인 경우가 많습니다. C언어에서도 이러한 법칙은 어느정도 통용되는 것 같습니다. 코드내에 0과 1이 외의 숫자가 나타나는 경우를 최소화 해야 합니다. 더욱 엄격하게 하자면 코드에서 0 이외의 모든 숫자는 빼는 것이 좋습니다. 그러면 어떻게 숫자를 빼야 할까요? enum에 해답이 있습니다. 아래와 같이 선언하면, 0과 1의 타입의 형태에서는 false와 true만 사용하게 됩니다. typedef enum { false = 0, true = 1 }bool; 위의 typedef enum 사용할 때 주의할 점이 있습니다. 바로 아래와 같이 사용하면 안됩니다. 왜 그럴까요? if(is_exist) //true { //when true, implements } else { //w..
1차원 배열을 넘어 2차원배열로 가면 문법을 자주 잊어버리기 일쑤입니다. C의 단점이기도한 복잡한 문법, 물론 C++보다는 낫습니다만 가독성이 많이 떨어집니다. 한번 정리할겸 기록해놓았습니다. foo(char (*string)[60]) { } main() { char string[20][60]; foo(string); } 간단하게 이렇게 넘깁니다. 아래는 간단한 예제로 파일명 정렬하는 소스입니다. MCHAR file_list[30][60]; file_sort(file_list, 20); static void file_sort(char (*files)[60], u8 count) { char tmp[60]; u8 i, j, n; n = count; for(i=0; i
돌고 도는 구조체를 어떻게 선언해야 할까요? 자기 자신을 포인터하는 구조체를 선언하는 방식이 바로 구조체전방선언이라고 불리우는 불완전 선언입니다. 아래 예제를 보도록 하겠습니다. 먼저 다음과 같이 불완전 선언부터 해야 합니다. 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(..