본문 바로가기

프로그래밍/C++63

C++] Intel hex to bin 변환 프로그램 (TI C2000 시리즈) Windows 콘솔용 Intel HEX 포맷 파일을 바이너리 파일로 변환하는 프로그램 기존에 잘 쓰던 프로그램이 있었는데 TI C28x 계열 MCU 대상으로 -a, -w 옵션을 사용하면 맨 뒤에 extra bytes가 더 붙는 문제가 있어서 직접 만들었다.  -a : C28x 코어는 주소 체계가 워드(16비트) 단위로 되어 있어서 HEX 파일의 주소도 워드 단위라 모든 address field를 왼쪽으로 1비트 shift해야 한다.-w : C28x 코어는 리틀 엔디안 구조지만 메모리가 워드 단위이다. HEX 파일의 데이터도 워드 단위로 저장되어 있어서 .bin 파일에 저장할 는 워드 내에서 바이트 순서를 스왑해야 한다.-p padding : 패딩 바이트 값 지정 (기본값: FF)-o output.bin .. 2025. 5. 24.
C++] std::chrono 라이브러리 C++ std::chrono 라이브러리 C++의 chrono 라이브러리는 시간과 관련된 작업을 처리하기 위한 도구다. 이 글에서는 C++ chrono 라이브러리의 세 가지 주요 클럭 구조체와 클럭 구조체와 함께 사용되는 duration, time_point 클래스에 대해 정리해보고자 한다.  🔍 클럭 구조체 클럭 구조체는 다음의 3가지가 존재한다. std::chrono::system_clock현재 시스템 시간을 나타내는 클럭이다.시스템 시간이 변경되거나 NTP(Network Time Protocol) 동기화 등으로 수정되면 system_clock의 값도 영향을 받는다.Windows에서는 GetSystemTimePreciseAsFileTime 함수를 래핑한 구조체로 구현된다.해상도는 밀리초 수준이다.주로.. 2025. 5. 12.
C++] explicit 키워드 explicit 키워드 C++에서 매개변수를 하나만 받는 생성자는 암시적으로 변환되어 객체를 생성할 수 있는데 이는 원하지 않은 변환을 초래할 가능성이 있다. 이를 방지하고 코드의 안정성을 높이기 위해 생성자 앞에 explicit 키워드를 사용한다.    explicit 키워드 없이 암시적 형 변환이 발생하는 경우#include class MyClass {public: MyClass(int value) : data(value) {} // explicit 키워드 없음 int getData() const { return data; }private: int data;};void printMyClass(MyClass myClass){ std::cout     🔍 위 코드에서 explici.. 2025. 5. 6.
C++ ] uint8_t, int_8t를 스트림 연산자(<<)로 출력할 때의 문제점 C++에서 char, singed char, unsigned char 타입은 스트림 연산자( uint8_t와 int8_t도 내부적으로 각각 unsigned char, singed char로 정의되어 있기 때문에 마찬가지이다. 즉, C++에서 8비트 데이터 타입 중 std::ostream  #include #include int main() { char c = 65; signed char sc = 66; unsigned char uc = 67; uint8_t u8 = 68; int8_t i8 = 69; std::cout    때문에 해당 타입을 정수로 출력하기 위해서는 명시적으로 다른 정수 데이터 타입으로 캐스팅을 하거나, std::cout (u.. 2025. 4. 18.
C++] 파일 입출력시 최적화 방안 C++ 기준 파일 입출력 시 최적화를 통해 속도 개선하는 방법들을 몇가지 소개한다. 1. 큰 버퍼를 미리 할당해서 메모리 재할당 방지 std::vector, std::string 등은 내부적으로 동적 메모리를 사용하는데, push_back()이나 append()로 데이터를 계속 집어넣다 보면 사이즈가 커질 때마다 메모리 재할당이 발생해서 성능이 저하될 수 있다.이를 방지하기 위해 reserve()로 초기에 충분한 용량을 미리 확보해 두면 이후 데이터 추가 시 메모리 재할당 없이 빠르게 처리할 수 있다.reserve()는 capacity만 늘릴 뿐 size()나 length()에는 영향을 주지 않으며, 선언 시 큰 사이즈로 만든 다음 clear()를 하더라도 capacity는 그대로 유지된다. std:.. 2025. 4. 17.
C++ ] <random> 헤더 사용 난수 생성 C++ 헤더를 사용해 난수 생성하는 방법 1. 헤더 파일 포함#include    2. 시스템 기반 난수 시드 생성시스템에서 제공하는 하드웨어 기반 난수 시드를 가져온다.std::random_device rd;   3. 난수 생성 엔진 초기화시드를 사용해 난수 생성 엔진을 초기화한다. 보통은 Mersenne Twister 알고리즘을 사용한 std::mt19937 엔진을 많이 사용한다.std::mt19937 gen(rd()); // Mersenne Twister 엔진에 시드 할당   4. 분포 정의 (범위와 형식 설정)난수가 발생할 범위와 형식은 분포(distribution)를 통해 정의한다.  정수형 균등 분포, 범위 내의 모든 값이 동일한 확률로 선택된다.std::uniform_int_distribu.. 2024. 12. 3.
C++ ] CLI Loading indicator와 Progress bar 사용자에게 작업이 진행중임을 알리는 간단한 로딩 인디케이터와 프로그레스 바 만들어보기   로딩 인디케이터 #include #include using namespace std;bool running = true;void loading_indicator() { const char* states[] = {" ", ". ", ".. ", "... ", ".... ", "....."}; int index = 0; while (running) { cout      프로그레스 바 #include #include #include using namespace std;class ProgressBar {private: int barWidth; int progress;.. 2024. 10. 28.
C++ ] 가변 인자 템플릿(Variadic Templates) 활용 C++ 11에서 도입된 가변 인자 템플릿이란 함수가 불특정 다수의 여러 인자를 받을 수 있게 해주는 기능이다. 가변 인자 템플릿은 C의 stdarg.h에 있는 가변 인자 매크로들과 비슷한 역할을 한다고 볼 수 있는데 그 사용법에 있어서는 큰 차이가 있다. 이에 대해 한번 알아보자.   1. 템플릿(Templates)이란?템플릿은 C++에서 함수나 클래스를 정의할 때 그 타입을 일반화하여 코드 재사용성을 높이는 기능이다. 템플릿을 사용하면 특정 데이터 타입에 종속되지 않고, 다양한 타입에 대해 동일한 코드 구조를 사용할 수 있다. 템플릿을 선언할 때는 다음과 같은 구문을 사용한다. 여기서 T는 타입 매개변수로 함수나 클래스가 다양한 데이터 타입에 대해 동작하도록 일반화할 수 있게 해준다. template .. 2024. 9. 2.
C++ ] 문자열 탐색 및 조작 함수, find() 외 문자열 탐색 함수 find : 문자열/문자의 처음 등장 위치 찾기rfind : 문자열/문자의 마지막 등장 위치 찾기find_first_of : 문자 집합 중 하나라도 처음으로 등장하는 위치 찾기find_last_of : 문자 집합 중 하나라도 마지막으로 등장하는 위치 찾기find_first_not_of : 주어진 문자 집합에 없는 첫번째 문자 위치 find_last_not_of : 주어진 문자 집합에 없는 마지막 문자 위치 찾기 ✔️ 위의 문자열 탐색함수는 문자열 내에서 특정 조건을 만족하는 요소를 찾지 못했을 경우 string::npos를 반환한다. string::npos는 상수값으로 size_t 타입의 최대값이다.✔️ find와 rfind 함수는 주어진 문자열에서 특정 문자열 뿐만 아니라 단일 문자를.. 2024. 6. 11.
C++ ] std::condition_variable 사용법 std::condition_variable은 C++에서 스레드 간의 동기화를 위해 사용되는 매커니즘 중 하나로, 한 스레드가 특정 조건이 충족될 때까지 대기하도록 하고, 다른 스레드가 그 조건을 충족시켰을 때 대기 중인 스레드를 깨우는 방식으로 사용한다. std::condition_variable은 주로 std::mutex와 함께 사용되며, 뮤텍스의 소유권을 관리하기 위해 std::unique_lock 클래스와 결합하여 사용된다. std::condition_variable 사용 패턴 스레드는 std::unique_lock를 사용하여 뮤텍스를 잠근다. 스레드는 std::condition_variable의 대기 함수(wait, wait_for, wait_until)를 호출하여 특정 조건이 충족될 때까지 대기.. 2024. 5. 12.