시작은 미미하나 끝은 쥬쥬하리라.

Develop

more

[C++] volatile 한정자(Volatile Qualifier)와 장치 레지스터·스레드 플래그에서 갈리는 쓰임

목차volatile 한정자(Volatile Qualifier)volatile 이 보장하지 않는 것 · 스레드 동기화응용 · 장치 레지스터와 정지 플래그요약1. volatile 한정자(Volatile Qualifier)volatile 은 "이 변수는 프로그램이 모르는 사이에 값이 바뀔 수 있으니, 접근할 때마다 실제 메모리를 읽고 쓰라" 고 컴파일러에게 알리는 한정자임.const 와 같은 자리에 붙는 형식 한정자(cv-qualifier)이며, 두 개를 함께 쓰는 것도 가능함.ex) volatile int, const volatile uint32_t 왜 필요한가 — 컴파일러 최적화컴파일러는 "이 코드만 보면 값이 바뀔 일이 없다" 고 판단되면 메모리 접근을 줄임.(1) 레지스터 캐싱 : 같은 변수를 반복해서..

Language - C++ 2026.10.21 0

[C++] 변경 플래그(Dirty Flag)와 일괄 가져오기가 놓치는 저장 경로

목차증상원인해결변경 플래그(Dirty Flag) 설계요약1. 증상다국어 번역 사전을 편집하는 창에서 발생한 버그.스프레드시트 파일로 문구를 가져온 뒤 [적용] -> [닫기] 를 누르고 창을 다시 열면 가져오기 전의 값이 그대로 남아 있음.가져오기 직후 표에는 새 값이 정상적으로 보임. [적용]을 누르면 "저장되었습니다" 안내까지 뜸.-> 화면도 정상, 안내 메시지도 정상이라 사용자 입장에서는 저장이 끝난 것으로 보임. 재현 조건의 특이점1. 기존 항목을 전부 지운 뒤 가져오면 정상 저장됨.2. 같은 내용을 CSV 형식으로 가져오면 정상 저장됨.3. 창을 열고 나서 첫 번째 수정이 스프레드시트 가져오기일 때만 재현됨. -> 같은 데이터, 같은 표인데 "그 전에 무엇을 했는가"에 따라 결과가 갈림.=> 데이..

Trouble Shooting 2026.10.19 0

[C++] 기본값 불일치(Default Mismatch)와 읽기 전용 주소를 조용히 버린 양식 출력

목차증상원인해결기술 배경요약 1. 증상 스프레드시트 양식의 셀에 주소 식을 적어두면, 출력 시점에 그 주소의 현재 값을 셀에 채워 넣는 기능이 있음.ex) 셀 B7 에 {Boiler.Temp} 를 적어두면 출력 파일의 B7 에 보일러 온도 값이 기록됨.출력된 파일에서 일부 셀만 값이 채워지지 않고 비어 있는 증상 발생. 특이 사항1. 같은 주소들이 화면 모니터링·데이터 수집에서는 정상 값으로 확인됨.2. 이름 주소에 연결된 장치 주소를 다른 장치 주소로 바꾸면 정상 기록됨.3. 편집기 빌드는 에러 없이 성공.-> 주소 자체는 멀쩡한데 이 기능에서만 사라짐.-> 연결된 장치 주소에 따라 결과가 갈림. 이게 단서. 2. 원인 주소는 만드는 쪽과 쓰는 쪽이 분리되어 있음편집기 안에서 주소 객체는 생성만 ..

Trouble Shooting 2026.10.12 0

[C++] 빈 문자열 센티널(Empty Sentinel)과 못 찾았는데 이어 붙이는 재귀 탐색

목차빈 문자열 센티널(Empty Sentinel)작은 함수 하나에 결함 셋 · 고치다 생긴 회귀요약1. 빈 문자열 센티널(Empty Sentinel)증상은 이랬음. 화면에 시각 표시 요소를 올리면 읽어올 주소가 자동으로 하나 채워지는데, 그게 유효하지 않은 주소였음. 그대로 빌드하면 오류가 남. 자동으로 채우는 쪽은 재귀 탐색 함수였음. 등록된 주소 목록을 훑다가 구조체를 만나면 그 안으로 더 들어가서, 시각 계열 자료형을 가진 멤버를 찾으면 경로를 점으로 이어 붙여 돌려줌.- 찾으면 "Tank.Stamp" 같은 문자열.- 못 찾으면 빈 문자열 "".-> 이게 빈 문자열 센티널임. 별도의 "없음" 표현을 두지 않고 값의 한 형태로 실패를 나타내는 방식. 이 방식 자체가 나쁜 건 아님- 문자열을 돌려주는 ..

Trouble Shooting 2026.10.07 0

[Window OS] 마우스 휠 라우팅(Mouse Wheel Routing)과 포커스 · 커서 두 대상이 함께 움직인 숫자 입력 칸

목차증상원인해결기술 배경요약 1. 증상 한 설정 창 안에 숫자 증감 입력 칸(스핀 에디트)이 여러 개 있는 화면에서 발생.ex) 상태 ON 용 최대 길이 칸 / 상태 OFF 용 최대 길이 칸이 나란히 있는 창 재현 (1) 첫 번째 칸을 클릭해 포커스를 줌.(2) 마우스 커서를 두 번째 칸 위로 옮김.(3) 휠을 한 칸 굴림.-> 두 칸의 값이 동시에 바뀜. 그것도 서로 반대 방향으로. 또 하나의 증상 포커스가 있는 칸 위에 커서를 두고 휠을 굴리면 값이 전혀 바뀌지 않음.-> "휠이 안 먹는다"와 "엉뚱한 칸까지 바뀐다"는 서로 다른 버그처럼 보이지만 원인은 하나. 2. 원인 한 핸들러 안의 두 처리 문제의 스핀 컨트롤은 서드파티 컴포넌트이고, 휠 입력을 윈도우 메시지 핸들러에서 처리.그 핸들러는 상..

Trouble Shooting 2026.10.05 0

DevOps

more

[AI] 그라운딩(Grounding)과 닫힌 어휘로 LLM 실행 계획의 환각을 구조적으로 막기

목차그라운딩(Grounding)과 닫힌 어휘응용 · 스냅샷과 카탈로그로 근거 주기응용 · 받은 쪽에서 막기요약1. 그라운딩(Grounding)과 닫힌 어휘그라운딩은 LLM 이 답을 만들 때 기댈 사실을 입력으로 직접 주어, 모델의 기억이 아니라 주어진 근거 위에서 답하게 하는 것을 의미.할루시네이션(환각) 을 줄이는 프롬프트 기법은 [AI] 할루시네이션(Hallucination)과 프롬프트를 통한 방지 대책 글에서 다룸.이 글은 그 다음 단계로, 프롬프트 문장이 아니라 시스템 구조로 환각을 막는 방법을 다룸. LLM 이 실행 계획을 만들 때 생기는 환각데스크톱 편집기에서 "왼쪽 위에 버튼 3개를 놓고 데이터 소스에 연결해줘" 같은 요청을 받아 LLM 이 편집 계획(JSON) 을 만드는 상황임. 이때의 환..

Knowledge - AI 2026.10.28 0

[Window OS] UI 스레드 규칙(UI Thread Affinity)과 PostMessage 로 작업 스레드 이벤트를 넘기는 소유권 설계

목차UI 스레드 규칙(UI Thread Affinity)작업 스레드에서 UI 로 넘기는 방법들응용 · PostMessage 와 소유권 이전UI 스레드가 기다릴 때의 교착요약1. UI 스레드 규칙(UI Thread Affinity)UI 스레드 규칙은 창과 컨트롤은 그것을 만든 스레드에서만 다뤄야 한다는 데스크톱 UI 프레임워크 공통의 제약을 의미.Win32 창은 만든 스레드의 메시지 큐에 묶여 있고, VCL · Qt Widgets · WinForms 같은 프레임워크 대부분이 내부 상태를 락 없이 다룸.-> 작업 스레드가 Label->Caption 을 바꾸거나 목록에 항목을 추가하면, 그 순간 UI 스레드도 같은 객체를 그리고 있을 수 있음.-> 증상은 가끔 깨지는 화면, 가끔 나는 접근 위반. 재현이 어려..

[AI] 출력 계약(Output Contract)과 JSON 계획을 받는 검증 · 자기 수정 루프

목차출력 계약(Output Contract)과 검증 루프응용 · JSON 계획을 받는 세 겹의 검사자기 수정 재요청(Self-Correction Retry)요약1. 출력 계약(Output Contract)과 검증 루프LLM 의 출력을 프로그램이 그대로 실행할 데이터로 쓰려면, "어떤 모양으로만 답하라" 는 계약을 정하고 그 계약을 지켰는지 코드로 확인하는 고리가 함께 있어야 함.이 둘을 합쳐 이 글에서는 출력 계약과 검증 루프라고 부름. API 의 구조화 출력 기능만으로 충분하지 않은 이유주요 LLM API 는 JSON 스키마를 주면 그 형식으로 답하게 하는 기능을 제공함. 이 기능 자체는 [AI] 구조화된 출력(Structured Outputs)과 Gemini API를 통한 JSON Schema 데이터..

Knowledge - AI 2026.10.26 0

[Window OS] 겹친 입출력(Overlapped I/O)과 파이프 수신 스레드를 안전하게 끝내는 방법

목차겹친 입출력(Overlapped I/O)응용 · 파이프 수신 스레드 설계안전하게 끝내기와 정리 순서요약1. 겹친 입출력(Overlapped I/O)겹친 입출력은 읽기 · 쓰기 요청을 걸어 두고 함수는 즉시 반환하며, 완료는 나중에 따로 확인하는 Windows 의 비동기 입출력 방식을 의미.여러 입출력이 동시에 "겹쳐서" 진행될 수 있다는 뜻에서 이름이 붙음. 동기 입출력의 문제파이프를 보통 방식으로 열고 ReadFile 을 부르면, 데이터가 올 때까지 그 스레드는 멈춤.(1) 깨울 방법이 없음 : 앱을 끄려는데 수신 스레드가 ReadFile 안에서 영원히 기다리고 있으면 스레드를 정상 종료시킬 수 없음.(2) 같은 핸들의 다른 작업이 막힘 : 동기 핸들에서는 입출력이 핸들 단위로 직렬화됨. 한 스레드..

[Window OS] 32비트·64비트 프로세스 경계(WOW64)와 네임드 파이프(Named Pipe)를 고른 IPC 설계

목차32비트 · 64비트 프로세스의 경계(WOW64)DLL 이 아니라 별도 프로세스인 이유대안 분석 · "64비트 DLL + 중개 프로세스"IPC 방식 비교 · 익명 파이프 / MMF / 네임드 파이프요약1. 32비트 · 64비트 프로세스의 경계(WOW64)이 글은 [AI] 사이드카 에이전트(Sidecar Agent)와 레거시 데스크톱 앱에 LLM 기능을 붙이는 구조 의 후속임.상황을 다시 정리하면 다음과 같음.호스트 : RAD Studio(C++Builder) + VCL 로 만든 32비트 편집기. 이미 32비트 Qt5 로 만든 보조 DLL 몇 개를 같은 프로세스에 올려 쓰고 있음.새 기능 : LLM 통신을 담당하는 에이전트. 앞으로 편집기 자체를 Qt6 로 옮길 계획이 있어 Qt6 로 개발하는 것이 고..

DevKit

more

[RAD Studio] RTTI(Run-Time Type Information)와 published 속성으로 만드는 범용 설정 저장

목차RTTI(Run-Time Type Information)RAD Studio 의 두 갈래 RTTI · 고전 RTTI 와 확장 RTTI응용 · 이름으로 속성 다루기와 범용 설정 저장주의점요약1. RTTI(Run-Time Type Information)RTTI 는 실행 중에 객체의 타입 정보를 꺼내 볼 수 있게 컴파일러가 실행 파일 안에 남겨 두는 정보를 의미.보통 C++ 코드에서 타입은 컴파일이 끝나면 사라짐. 실행 중에는 메모리 덩어리와 함수 주소만 남음.-> "이 포인터가 실제로 무슨 클래스인가", "이 객체에 어떤 속성이 있는가" 를 실행 중에 묻고 싶으면, 그 답을 어딘가에 미리 적어 둬야 함.=> 그 기록이 RTTI 임. 표준 C++ 의 RTTI표준 C++ 이 제공하는 RTTI 는 범위가 좁음...

IDE - RAD 2026.10.23 0

[Qt] Shadow Build

목차Shadow Build응용/심화요약1. Shadow BuildShadow Build는 Qt에서 사용되는 Out of Source 형태의 빌드 종류임.Out of Soruce : 소스 폴더 외부의 별도 디렉토리에 산출물을 분리하는 빌드 종류.-> Qt의 qmake는 빌드 산출물을 특정 디렉토리로 모을 수 있는데 shadow build는 자동적으로 이 구조를 만듬. 빌드 산출물 분리의 장점(1) 빌드 환경에 폴더로 분리.-> 특정 폴더를 그대로 보존하여 버그 재현에 용이.(2) Debug / Realese 동시 보유.-> 각 모드의 전환 비용이 감소.(3) 워크스페이스 정리 단순.-> CI 측면에서 캐시 / 아티팩트 등 관리가 용이함. 2. 응용/심화상대 경로와 생성 파일Qt 빌드는 moc / uic /..

IDE - QT 2026.02.03 0

[RAD Studio] FastMM을 통한 메모리 관리

목차FastMMFastMM 설치 및 환경 설정FastMM을 통한 메모리 관리FastMM 환경 설정 관련 오류 해결1. FastMMFastMM은 Windows용 메모리 관리자로 델파이에서 사용 가능한 메모리 관리자임.FastMM 라이브러리를 프로젝트에 포함하게 되면 기존과 new / delete 하는 코드는 동일하나 내부적으로 컴파일 단게에서 메모리 할당과 해제 코드의 앞뒤에 가드 패턴을 삽입하여 메모리를 관리. - 옵션은 .inc 파일을 사용자가 직접 수정하여 라이브러리와 동일한 경로에 위치시키면 컴파일 단계에서 해당 inc 파일을 참조. 2. FastMM 설치 및 환경 설정본문에서는 FastMM4를 사용하며, 해당 파일 패키지는 검색을 통해 쉽게 찾을 수 있음. - 다운받은 파일을 확인하면 상위의 Fa..

IDE - RAD 2026.01.28 0

[QT] Qt4 - 기본 웹 브라우저로 설정한 URL 열기

기본 웹 브라우저로 설정한 URL 열기코드startDetached()코드미리 정의한 URL을 기본 브라우저로 오픈하는 코드를 구현해보겠습니다. URL을 미리 정의하고 기본 브라우저에서의 오픈은 startDetached() 함수로 구현하였습니다. int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); QString Url = "https://naver.com/"; QProcess::startDetached("cmd /c start " + Url); return a.exec();} 해당 로직은 main 함수에서 구현하였기 때문에 프로젝트를 실행하면 그 즉시 naver.com 도메인으로 연결됩니다. startDetache..

IDE - QT 2024.01.18 0

[QT] Qt4 - 단축키로 파일 오픈하기

단축키로 파일 오픈하기단축키 구현결과단축키 구현Qt4에서 단축키 관련 메서드를 이용하여 특정 문서를 오픈할 수 있는 방법은 많습니다. 저는 오늘 그 중에서 두 가지 방법을 보여드리려 합니다. 첫 번째 방법은 단축키를 누르면 문서 파일이 직접적으로 오픈되는 방법입니다. 두 번째 방법은 단축키 클릭 시, 파일 브라우저를 오픈하는 방법입니다. 아래는 코드입니다. #include #include #include #include #include #include "mainwindow.h"#include "ui_mainwindow.h"MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow){ ui->set..

IDE - QT 2024.01.18 0

Study

more

[열혈 C++ 프로그래밍] (16) C++ 형 변환자

C언어 기반 C++ 2형 변환 연산1형 변환 연산2형 변환 연산3형 변환 연산1C++ 형 변환다운 캐스팅 등 문법적으로 에러가 있더라도 컴파일 에러를 일으키지 않고 형 변환 연산 처리 C++의 형 변환 : 4가지의 종류로 분할하여 사용 -> 각 종류 별 케이스에 일치하지 않으면 컴파일 에러 발생, 문법적 오류 발견 가능 1. static_cast 2. const_cast 3. dynamic_cast 4. reinterpret_cast dynamic_cast(안전성 보장) static_cast(안전성 미 보장) 형 변환 연산2dynamic_cast포인터 또는 참조자를 T형으로 변환하되, 안전한 형 변환만을 허용ex) B클래스의 기초 클래스 A클래스일 때, B클래스의 포인터를 A클래스의 포인터로 변환하는..

[열혈 C++ 프로그래밍] (15) 예외처리

예외처리예외 상황, 예외 처리예외처리 메커니즘Stack Unwinding예외상황 표현하는 예외 클래스 설계예외처리예외 상황, 예외 처리예외 상황문법적 오류가 아닌 프로그램 논리에 맞지 않는 오류 ex) 나이 입력 : 0보다 작은 값 입력 -> 예외 상황 예외 처리조건문을 통해 예외를 발견하고 처리가 가능하지만 이러한 방식은 예외처리부와 일반 코드를 쉽게 구분 불가 -> C++에서 별도 메커니즘 제공 : try, catch, throw 예외처리 메커니즘try, catch, throwtry 블록에서 발생한 예외는 catch 블록에서 처리 try : 예외 발생의 검사 범위를 지정, 예외가 발생할 가능성이 있는 코드 블록 catch : try블록에서 발생한 예외를 처리, 예외 핸들러가 처리할 내용을 담은 코..

[열혈 C++ 프로그래밍](14) 템플릿 2

템플릿 2내용 확장 클래스 템플릿의 특수화 템플릿 인자 템플릿과 static내용 확장const변수, 객체의 상수화 키워드 클래스 템플릿의 특수화템플릿컴파일러가 클래스를 만드는데 사용되는 템플릿을 정의 -> 컴파일러가 템플릿을 확인하고 템플릿 기반 클래스를 생성 -> 템플릿 클래스에서 객체를 생성 BoundCheckArray iarr(50); BoundCheckArray> oarr(50); -> 와 같이 객체 생성 가능Point int형 : BoundCheckArray*>로 객체 생성 -> typedef Point* POINT_PTR; = BoundCheckArray oparr(50);과 동일 + 템플릿 클래스 자료형을 대상으로 일반함수 정의 가능 + 클래스 템플릿 내부에서 일반 함수를 대상으로 f..

[열혈 C++ 프로그래밍] (13) 템플릿 1

템플릿 1템플릿과 함수 템플릿1 템플릿과 함수 템플릿2 클래스 템플릿 템플릿일부만 결정되어 있고 나머지는 사용하는 순간에 결정되는 것 -> 함수의 기능은 결정되어 있지만 자료형이 결정되어있지 않고 의존적이지 않은 것 int add(int a, int b) { return a+b } -> double형 데이터를 대상으로 연산하지 못함 -> double형 데이터를 int형으로 캐스팅하여 연산 할 수 있지만 데이터 손실 발생 -> double형 데이터 연산을 하는 함수 작성 필요 -> 자료형 마다 함수를 추가 작성하는 것이 비효율적이라서 템플릿 사용 T add(T a, T b) { return a+b }-> 함수 템플릿 -> T가 어떤 것인지 컴파일러가 알 수 있게 명시 + template {typename..

[열혈 C++ 프로그래밍] (12) String 클래스 디자인

String 클래스 디자인 C++표준, string클래스 문자열 처리 클래스 C++ 표준, string 클래스String문자열 처리를 위해 제공되는 클래스, string.h 헤더 파일을 포함해야 사용 가능 string str1 = "a";string str2 = "b";string str3 = str1 + str2;-> str1.operator+(str2);를 호출 : operator+() 함수는 string.h 헤더 파일에 정의 -> operator+() 이외에도 문자열과 관련한 operator+=(), ==() >() 등의 함수가 정의 문자열 처리 클래스length()문자열의 길이를 반환하는 stirng 메소드 size()메소드도 길이를 반환하고 같은 값을 반환하지만, size는 객체가 메모리에..

반응형