코딩세상(8)
-
(C언어) network byte order, float 변환 함수 구현 (ntohf, htonf)
인터넷 설정을 하다 보면 network이라는 문구를 많이 보게 된다. network이라는 것을 어렵게 생각하지 말고 인간관계에서 친구라고 보면 된다. 친구들도 속성이 다 달라서 규칙을 정하지 않으면 소통에 오류가 생기게 된다. 인터넷에서 제일 중요한 data를 주고받는 방법이 필요한데, 이를 정의한 것이 byte order이라는 것이 있다. 현재 network 통신에서는 기본적으로 big endian을 사용하도록 되어 있다. big endian, little endian이 뭔지 생각 하지 말고, network으로 통신 시에는 무조건 big endian으로 맞추어 줘야 한다는 것을 기억하자. 네트워크는 byte 단위로 data가 전송이 되는데, 2bytes 이상에서는 먼저 전달되는 data가 큰 쪽인지 작..
2024.01.15 -
(C언어) log level 설정 출력 제어
printf 출력이 실시간이 아니라는 것을 이야기하였는데, fprintf와 혼용하여 사용하기에는 조금 복잡한 면이 있다. 프로그램상 환경에 따라 출력 양을 조절할 필요도 있다. log level조정과 다양한 형식으로의 출력을 할 수 있는 공개된 소스가 많이 있는데, 기능이 많다 보니 적용하여 사용하기에 어려움을 겪는 부분도 있다. 공개된 소스가 아닌, 아주 간단한 MACRO를 이용하여 단순한 형태의 log level을 설정하여 보자. 안드로이드에서 많이 보이는 ALOGV, ALOGI, ALOGD,ALOGE 로 사용하여 보자. 먼저 출력할 순서를 정하자. 기본적으로 출력할 수 있는 log macro를 만들어 보자. 현재 level이 출력이 가능한지 check하고 출력하도록 하자. C언어 함수와 같이 사용 ..
2024.01.11 -
(C언어) String의 주소 이해하기 ("...")
C언어 코딩을 하다 보면 여러 라인에 걸쳐 출력을 하고 싶은 경우가 생긴다. 요즘은 컴퓨터 성능이 워낙 좋아서 크게 신경 쓰지 않고 각각 출력하여 문제가 없다. 아래와 같이 각각의 변수에 따라 함수를 호출 하면 된다. CPU 성능이 약한 MPU level에서 작업을 한다면, 느린 성능을 가진 printf를 여러 번 호출하는 것은 좀 부담이 될 수 있다. 이를 한번만 호출하게 수정을 하려면 어떻게 해야 할까?? 간단하게 아래와 같이 수정을 할 수 있다. 이제 한 줄로 되었는데 indentation이 엉망이다. 이렇게 해서야 사용하기가 좋지 않다. 여기서 "" 의 의미가 주소연산자의 연속을 의미한다는 것을 안다면 아래와 같이 string을 배치하여 연속적인 주소에 있는 문자로 표시할 수 있다. 콤마(,)가 ..
2024.01.09 -
(C언어) 연속된 enum 처리를 위한 switch문 사용하기 (case 0 ... 9:)
C언어에서 switch 문은 잘 사용하면 보기 좋은 프로그램이 된다. python 언어를 사용할 때 이 switch 문이 없어서 당황한 적도 있었다..^^ 대부분 if, else if, else 등으로 구현이 될 수 있으니 굳이 switch문을 사용하지 않아도 논리적 구현에는 문제가 없다. 앞 포스팅에서 16진수, 10진수 string으로 변환을 위하여 if문으로 아주 간단하게 구현을 하였다. if (mod
2024.01.08 -
(C언어) 변수에 저장된 값을 10진수 16진수 string으로 변환하기
int형으로 저장된 값을 10진수 16진수 string으로 변환을 하여야 할 때가 있다. 일반적인 알고리즘으로는 다음과 같이 변환을 할 것이다. 1. 10진수로 변환 시 음수인지 양수인지 결정 2. 10진수로 변환 시 음수일때는 양수로 변환 3. 10또는 16으로 나눈 나머지 값을 char형으로 저장 4. 기존 값을 10 또는 16으로 나누어서 다시 저장 5. 0이 될때 까지 3,4를 반복 6. 저장된 값을 최근 값부터 출력될 수 있도록 배열 정렬 위의 알고리즘을 코드로 변환하면 아래와 같이 장황해진다. 쉽지 않은 코드가 되었다. 특히 16진수 변환에는 음수로 출력되지 않고 양수로 출력해야 되는 문제로 좀 더 복잡해졌다. 결과는 아래와 같이 정상적으로 출력이 되었다. 이제 이 프로그램을 sprintf를 ..
2024.01.05 -
(C언어) printf() 함수 성능 및 예외 상황에서 출력 이해하기
프로그램 코딩에 있어 정보를 출력할 수 있다는 것이 얼마나 큰 축복인지 처음에는 이해할 수 없을 것이다. 특히 embeded 시스템이나 kernel 부분 작업을 하다 보면 깜깜한 밤에 한줄기의 빛이 출력되어 나오는 메시지를 보는 것일 것이다. printf로의 출력을 이해 하면 좀 더 디버깅하는데 도움이 될 것이다. 일반 OS가 있는 시스템에서 printf 출력은 실시간성을 보장해 주지 못한다는 것을 기억하자. 보통 출바꿈 문자인 "\n"을 만나면 저장되어 있는 buffer를 바로 출력해 주지만, 개행 문자가 없다면 출력이 다소 지연이 될 수 있다. Hello World를 출력하는 함수인데 개행 문자가 없다. 출력 지연이 생기다는 것이다. 지금은 다른 예외가 없어 개행문자가 없이도 정상적으로 출력이 되었다..
2024.01.04