본문 바로가기

프로그래밍/C72

strtoul, strtol, strtof 구현 기존 C표준 라이브러리 함수와 차이가 있다면, 원래 strtoul, strtol 함수는 명시적으로 base 인자를 받는데 이를 받지 않고 자동으로 base를 감지하도록 하였다. 이는 원래 함수에서 base 인자가 0인 경우와 같은 동작을 한다.또한 원래 strtoul, strtol 함수는 2진수 접두사 "0b"를 처리하지 않는데 이를 처리하도록 하였다.그리고 원래 strtof 함수 과학적 지수 표기(e 또는 E)를 지원하나 간단한 구현 및 처리를 위해 이를 지원하지 않는 버전으로 했다. #include // 공백 문자 확인int my_isspace(char c) { return (c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\v' || c == '.. 2025. 2. 22.
C ] X-Macro X-Macro란?  매크로 X()를 재정의하여 데이터를 다양한 형태로 확장하는 기법으로, 주로 리스트 데이터를 정의하고 이를 바탕으로 열거형 및 이에 맵핑되는 문자열 배열을 생성하는데 사용된다.  사용 예시 #include // 리스트 정의#define ERROR_LIST \ X(ERROR_NONE) \ X(ERROR_INVALID) \ X(ERROR_TIMEOUT) \ X(ERROR_OVERFLOW)// enum 정의enum {#define X(name) name, ERROR_LIST#undef X ERROR_COUNT};// 문자열 배열 생성const char *ErrorNames[] = {#define X(name) #name, ERR.. 2025. 1. 30.
C ] TUI ARINC429 비행 데이터 송신 앱 (Text-based User Interface) 개발 배경 :콘솔 창에 그래픽 요소를 추가하여 사용자 친화적인 인터페이스를 구현한 형태를 TUI(Text-based UI) 또는 CUI(Console UI)라고 한다. TUI 사용자로부터 키보드 입력을 받아 프로그램을 제어하고 데이터를 시각적으로 구분하기 위해 박스나 테두리를 활용해 레이아웃을 구성하고 색상을 입혀 데이터를 강조한다.이런 TUI 앱을 한번 만들어봐야지 하고 생각했었는데 마침 적당한 사례를 발견해서 업무상 굳이 필요는 없었지만 개인 시간을 들여 한번 만들어 봤다.  어플리케이션 설명 :이 어플리케이션은 대기 자료 컴퓨터(Air Data Computer)를 시뮬레이션하기 위한 도구로 특정 비행 정보를 정해진 주기로 송신하도록 제어할 수 있다. 현재 송신하고 있는 데이터를 시각적으로 표시하며,.. 2025. 1. 7.
C] 콘솔 프로그램 플리커 현상 개선하기 (더블 버퍼링 & 오프스크린 버퍼) 콘솔 화면을 주기적으로 갱신하는 프로그램을 개발 시 화면이 깜빡이는 플리커(flicker) 현상이 발생할 수 있다. 이번 글에서는 이런 플리커 현상을 개선하기 위한 전략을 알아보자.  먼저 대략 60fps로 7세그먼트 형식의 디지털시계를 출력하는 C언어 프로그램을 작성해보았다. 프로그램을 실행시키면 아래 이미지 처럼 화면이 깜빡이면서 출력되는 것을 볼 수 있다.    1. 플리커 현상의 원인은? 플리커 현상은 화면 갱신 과정에서 발생하는 중간 상태가 사용자에게 노출되면서 발생한다. 아래 코드를 보면 system("cls")를 사용해 화면을 완전히 지운 후, 초기화된 화면에 새로운 데이터를 출력하고 있다. 이 과정이 빠르게 반복되면서 빈 화면과 새 데이터를 그리는 중간 상태가 짧은 시간 동안 화면에 보여지.. 2025. 1. 5.
inet_addr, inet_aton, inet_pton, inet_ntoa, inet_ntop 1. 문자열 형식의 IP 주소를 uint32_t 형식으로 변환하는 함수 :inet_addr, inet_aton, inet_pton  - inet_addr문자열 형식의 IPv4 주소를 uint32_t로 변환.반환된 값이 네트워크 바이트 순서로 저장됨.Deprecated(더 이상 권장되지 않으며, 향후 버전에서 제거될 가능성이 있으니 사용을 자제해야하는 함수) 이므로 최신 코드에서는 inet_aton 또는 inet_pton을 사용하는 것이 권장됨.#include #include #if defined(_WIN32) || defined(_WIN64)#pragma comment(lib,"ws2_32")#include #else#include #endifint main() { const char* ip_str = .. 2024. 12. 17.
winmm API 사용하여 WAV 파일 재생하기 winmm 은 Windows Multimedia의 약자로 해당 라이브러리의 API를 사용해 WAV 형식의 오디오 파일을 재생할 수 있다.  #include #include // mmsystem.h 포함#include // winmm.lib 링크#pragma comment(lib, "winmm.lib")int main() { // wav 파일 경로 const char* filePath = "C:\\Users\\jo\\Downloads\\warning.wav"; // wav 파일 동기식 재생 MMRESULT result = PlaySound(filePath, NULL, SND_FILENAME); if (!result) { printf("PlaySound Error\n"); return 1; } print.. 2024. 7. 4.
C POSIX ] pthread, mutex 사용법 Pthread는 모든 유닉스 계열 POSIX 시스템에서, 일반적으로 이용되는 라이브러리로 병렬적으로 작동하는 소프트웨어 작성을 위해 사용할 수 있다. 소스코드에선 #include 로 헤더를 포함하고 컴파일 시 -pthread 옵션을 붙여 컴파일 한다.   주요 thread 함수  1. pthread_create 새로운 스레드를 생성하고 지정된 함수 start_routine을 실행한다.int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine) (void *), void *arg); 파라미터 :pthread_t *thread: 생성된 스레드의 식별자를 저장할 포인터, 해당 식별자를 통해 이후 스레드를 제어할 .. 2024. 6. 26.
C] epoll 사용법 epoll이란?epoll은 리눅스 커널 2.5.44부터 도입된 Multiplexing IO 함수로 다수의 파일 디스크립터를 모니터링 할 때 효율적이다. epoll은 epoll_event 구조체와 다음의 세 가지 주요 함수로 구성된다.epoll_create : epoll 파일 디스크립터 저장소 생성epoll_ctl : 저장소에 파일 디스크립터 등록 및 삭제epoll_wait : 파일 디스크립터의 변화를 대기   select와의 차이점select의 경우 매번 호출할 때마다 파일 디스크립터 집합을 사용자 공간에서 커널 공간으로 복사해야 하지만 epoll는 한 번 설정한 파일 디스크립터 집합을 커널 공간에서 유지하여 불필요한 복사를 방지한다. 따라서 많은 수의 파일 디스크립터를 다룰 때 epoll이 더욱 효율적.. 2024. 6. 24.
__DATE__ 에서 필요한 정보를 추출하여 원하는 포맷으로 출력하기 __DATE__, __TIME__ 은 ANSI/ISO 표준으로 정의되고 C 컴파일러 전처리기가 제공하는 특수한 매크로로 소스파일이 컴파일 시점의 날짜와 시간 정보를 나타내는 문자열 리터럴이다. 보통 __TIME__ 의 경우는 우리가 자주 사용하는 형태와 동일하기 때문에 따로 손댈게 없다. 하지만 __DATE__ 의 경우 월, 일, 년도 순이고 월은 영문에 일은 한자리 수 인경우 앞이 공백이여서 그대로 쓰기엔 애매하다. 따라서 __DATE__를 원하는 형태의 formatted string으로 출력하기 위해 다음의 두가지 방법이 있다. 첫번째 방법 yyyy-mm-dd 로 출력하고자 하는 경우 해당 digit Character를 추출해서 조합하는 형태 #include #define BUILD_YEAR_CH0 .. 2024. 4. 17.
C언어 ] qsort (Quick Sort, 퀵정렬) 함수 사용법 C언어 표준 라이브러리에 포함된 qsort 함수는 퀵 정렬(Quick Sort) 알고리즘을 사용하여 배열을 정렬하는 데에 사용된다. 아래는 qsort 함수의 사용법에 대한 예시이다. 1. 헤더 파일 include qsort 함수를 사용하려면 stdlib.h 헤더 파일을 포함해야 한다. #include 2. 비교 함수 작성 qsort 함수를 사용하기 위해선 정렬을 위해 사용할 비교 함수를 만들어야 하며, 이 함수는 두 요소를 받아들여 비교한 결과를 반환해야 한다. 반환값이 음수, 0, 양수인지에 따라 정렬의 순서가 결정된다. 비교 함수의 반환값이 양수면, qsort 함수는 두 요소의 순서를 바꾼다. int compare(const void *a, const void *b) { // 비교 로직 작성 retu.. 2024. 1. 30.