분류 전체보기 254

C언어 표준과 책의 기술 범위 [C언어 표준 라이브러리 함수]

C언어는 1972년 벨 연구소의 데니스 리치가 B를 기반으로 만든 언어입니다. 1983년 미국 국가 표준 협회인 ANSI에서 ANSI X3.159-1989 표준을 지정한 것이 C언어 표준의 시작입니다. 1999년 C99 표준으로 잘 알려진 ISO/IEC 9899:1999를 출간하고 2005년에는 ANSI에서도 C99를 표준으로 채택합니다. 그리고 2011년에 C11 표준인 ISO/IEC 9989:2011을 출간합니다. ANSI X3.159-1989 표준에서는 미국 국가 표준 협회에서 최초로 지정하였고 변수 이름과 함수 이름 등을 영어 알파벳과 언더 바, 숫자만 사용할 수 있습니다. char 형식도 다양한 기호와 숫자 문자, 영어 알파벳은 표현할 수 있지만 한글이나 한자 등을 표현하려면 문자열을 빌려서 표..

7. 첫 번째 실습 – 도형 이동 시키기 [Windows API]

안녕하세요. 언제나휴일입니다. 이번에는 현재까지 다룬 내용(윈도우 클래스 등록 및 개체 생성, 기본 그리기, 키보드 입력, 마우스 입력, 타이머 입력)을 정리하는 실습을 할게요. 실습할 시나리오는 다음과 같습니다. 주어진 공간 안에서 도형을 이동시키는 프로그램 방향 키를 누르면 도형의 방향이 바뀐다. space 키를 누르면 도형은 멈춘다. 현재 방향과 도형의 좌표(논리 좌표)를 출력하시오. 마우스 왼쪽 버튼을 클릭하면 도형이 바뀐다.(사각형->원->사각형->원…) 도형이 움직일 수 있는 공간을 표시하고 논리 좌표에 맞게 모눈을 그리시오. 도형은 움직일 수 있는 공간 경계 밖으로 이동할 수 없어요. 진입점에서는 윈도우 클래스 등록, 개체 생성, 메시지 루프를 작성합니다. #include #define MY..

6. 타이머 입력 [Windows API]

안녕하세요. 언제나휴일입니다. Windows API에서 주기적인 작업을 할 수 있게 타이머를 제공하고 있어요. 타이머를 생성할 때는 SetTimer 함수를 이용하고 해제할 때는 KillTimer를 사용합니다. UINT_PTR WINAPI SetTimer(HWND hWnd,UINT_PTR nIDEvent,UINT uElapse, TIMERPROC lpTimerFunc); hWnd: 타이머 메시지를 처리할 윈도우 nIDEvent: 타이머 일련 번호(개발자가 정의) uElapse: 타이머 메시지를 발생할 주기(1/1000초 단위) lpTimerFunc: 타이머 메시지를 수행할 함수(NULL 전달하면 hWnd의 콜백 프로시저에 WM_TIMER 메시지 발생 typedef VOID (CALLBACK* TIMERPR..

5. 키보드 입력 [Windows API]

안녕하세요. 언제나휴일입니다. 이전 강의에서 마우스 입력을 알아보았어요. 이번에는 키보드 입력을 알아볼게요. Windows API 키보드 입력에 관한 주요 메시지는 WM_KEYDOWN, WM_KEYUP, WM_CHAR 입니다. 윈도우즈 운영체제에서 키보드 포커스를 소유한 윈도우는 전체 시스템에서 유일합니다. 그리고 이러한 메시지(WM_KEYDOWN, WM_KEYUP, WM_CHAR)는 포커스를 소유한 윈도우에게만 발생합니다. 메시지 이름을 보면 알 수 있듯이 WM_KEYDOWN은 키 누름, WM_KEYUP은 키 뗌입니다. WM_CHAR는 문자 키를 입력하였을 때 발생할 수 있는 메시지인데 디폴트로 발생하지는 않습니다. 메시지 루프에서 TranslateMessage를 호출하면 WM_KEYDOWN 메시지 중..

4. 마우스 입력

윈도우즈 프로그램에서 사용하는 기본 입력 장치에는 마우스와 키보드가 있습니다. 그리고 시스템에서 제공하는 타이머도 자주 사용하는 입력 장치입니다. Windows API에서 제공하는 마우스 관련 메시지는 크게 세 종류로 구분할 수 있어요. 클라이언트 영역에서 마우스를 누르거나 뗐을 때 발생하는 메시지, NC(Noc Client, 비 클라이언트) 영역에서 마우스를 누르거나 뗐을 때 발생하는 메시지, 그 외의 메시지(마우스 위치를 조사하기 위한 메시지나 마우스 휠 등)가 있어요. 실제 프로그래밍에서 많이 처리하는 메시지는 클라이언트 영역에서 누르거나 뗐을 때 발생하는 메시지입니다. NC 영역에서 발생한 마우스 메시지는 DefWindowsProc에 의해 디폴트 처리를 하는 것이 대부분이겠죠. Client 영역 ..

3. 기본 그리기 [Windows API]

유튜브 동영상 강의 그리기 WM_PAINT - Windows API 1. DC와 그리기 절차 Windows API에서 그리기는 DC(Device Context)를 이용합니다. DC란 출력에 필요한 여러 정보를 가지고 있는 구조체로 라인이나 경계를 그릴 때 사용하는 펜, 면을 채울 때 사용하는 브러쉬 등의 정보를 갖고 있습니다. DC를 사용하지 않고 그리기를 한다고 가정하면 선을 그리기 위해 두 점의 좌표 뿐만 아니라 선의 형태, 선의 두께, 선의 색상 정보들을 인자로 전달해야 합니다. 사각형을 그리기 위해서는 좌표 뿐만 아니라 경계 선의 형태, 선의 두께, 선의 색상 정보, 면을 채울 색상, 패턴 등의 인자가 필요하겠죠. 이처럼 그리기를 위해 전달해야 하는 인자를 단순화하기 위해 Windows API에서..

2. 윈도우 클래스 등록 및 윈도우 개체 생성

유튜브 동영상 강의 윈도우 클래스 등록 및 생성 메시지 루프와 콜백 - Windows API 이번에는 윈도우 클래스를 등록하여 윈도우 개체를 생성하는 형태의 윈도우즈 응용 프로그램을 만들어 보기로 합시다. 이번 프로그램을 통해 윈도우즈 프로그램의 기본적인 동작 흐름을 파악할 수 있습니다. 윈도우즈 프로그램에서 자신의 원하는 형태로 창을 만들기 위해서는 윈도우 클래스를 등록한 후에 등록한 윈도우 클래스 형태의 인스턴스를 생성하는 것이 필요합니다. 윈도우즈 API에서는 비슷한 동작을 하는 버튼이나 리스트 박스 등을 만들 때 미리 등록해 놓은 윈도우 클래스를 이용하여 만들게 하고 있습니다. 다음은 이번에 작성할 윈도우즈 프로그램의 기본 흐름입니다. 제일 먼저 윈도우 클래스 속성을 설정합니다. 윈도우 클래스 속..

Part 33. 함수 포인터와 콜백

Part 33. 함수 포인터와 콜백 115. 함수 포인터와 콜백 개요 C언어 함수 포인터 컴퓨터 프로그램은 수행할 작업들을 논리적으로 표현한 코드의 집합이라고 말할 수 있어요. 그리고 단위 작업의 논리 전개를 한 것이 함수죠. 컴퓨터 CPU내에는 현재 수행할 코드 메모리 주소를 기억하는 프로그램 카운터(PC) 레지스터가 있어요. 대부분의 코드는 수행한 후에 프로그래머 카운터를 1 증가하여 다음 위치에 있는 코드를 수행하죠. 하지만 함수를 호출하면 피호출 함수의 코드로 분기하고 끝나면 호출한 코드 다음 위치에 있는 코드가 동작해요. 이렇게 동작할 수 있는 이유는 함수 이름은 해당 함수가 수행할 코드의 시작 메모리 주소를 값으로 갖고 있기 때문이예요. 배열명이 원소 형식의 포인터라고 말하는 것처럼 함수명은 ..

C언어 장르별 도서 관리 프로그램 소스 코드

다음은 이번 실습에서 작성한 도서 관리 프로그램의 소스 코드입니다. // ehcommon.h #pragma once typedef enum _key key; enum _key { NO_DEFINED, F1, F2, F3, F4, F5, F6, F7, F8, F9,F10, ESC }; void clrscr(); int getkey(); //ehcommon.c #pragma warning(disable:4996) #include "ehcommon.h" #include #include #include void clrscr() { system("cls"); } int getkey() { int key = 0; key = getch(); if(key == 27) { return ESC; } if(key == 0)..

Part 32. 도서 관리 프로그램 IV - 저장 및 로드

Part 32. 도서 관리 프로그램 IV - 저장 및 로드 113. 도서 관리 프로그램 – 저장 C언어 도서 관리 프로그램 - 저장 기능 구현 이번에는 데이터를 파일에 저장하는 기능의 시퀀스 다이어그램을 작성하기로 해요. 먼저 App에서는 파일을 쓰기 모드로 열어야겠죠. 그리고 App의 정보를 파일에 저장해요. 프로그램의 데이터를 다른 물리 매체에 선형으로 보내는 것을 직렬화라고 불러요. 직렬화 함수에서는 마지막 부여한 장르 번호와 배열에 보관한 장르 개수를 저장하세요 그리고 배열에 보관한 장르들의 정보를 파일에 직렬화하세요. 장르의 정보를 직렬화하는 함수에서도 장르번호, 장르명, 마지막 부여한 도서 번호를 파일에 저장하고 배열에 보관한 도서 개수를 저장하세요. 그리고 배열에 보관한 모든 장르를 파일에 ..

Part 31. 도서 관리 프로그램 III - 도서 추가, 도서 목록, 도서 검색, 장르 삭제 기능 구현

Part 31. 도서 관리 프로그램 III 107. 도서 관리 프로그램 – 도서 추가 C언어 도서 관리 프로그램 - 도서 추가 기능 구현 이번에는 도서 추가 시퀀스 다이어그램을 작성하기로 해요. 도서 추가에서는 먼저 모든 장르 정보를 보여주게 하세요. 장르를 선택하고 도서 제목과 작가 이름을 입력받아 도서를 생성한 후에 선택한 장르에 도서를 추가해야겠죠. 장르에서는 새로운 장르를 생성하여 장르에 도서를 보관하게 하세요. 먼저 Book 헤더에 동적으로 도서를 생성하는 함수와 소멸하는 함수를 선언하고 소스에 구현하세요. 동적으로 Book 개체를 생성하는 함수에서는 동적으로 Book 형식 크기의 메모리를 할당받으세요. 할당받은 메모리를 초기화하고 반환하세요. void BookBook(Book *book,int..

Part 30. 도서 관리 프로그램 II - 장르 추가, 전체 장르 보기

Part 30. 도서 관리 프로그램 II - 장르 추가, 전체 장르 보기 C언어, 도서 관리 프로그램 104.도서관리프로그램 – 클래스다이어그램 도서 관리 프로그램에서는 장르별로 도서를 관리하게 할거예요. 따라서 사용자 정의 형식으로 프로그램, 장르, 도서로 역할을 구분하여 정의하기로 해요. 클래스 다이어그램에서는 프로그램에 정의할 형식을 클래스로 표시하고 클래스 간의 관계를 추가로 표시해요. 프로그램은 장르들의 집합체이고 장르는 도서의 집합체죠. 이와 같은 관계를 집합 관계(실선과 빈 다이아몬드)라 불러요. 이 외에도 클래스 간의 관계는 직접 연관 관계, 연관 관계, 집합 관계, 일반화 관계, 의존 관계, 실현 관계가 있어요. C++, Java, C# 처럼 OOP 프로그램에서는 이와 같은 관계에 어울리..

[C#] 3. Console 입출력 개요 - 3.1 서식 지정 문자열, 3.2 수식 포멧 문자열, 3.3 정수 및 실수의 자릿수 지정

3. Console 입출력 개요 프로그래밍 언어를 배울 때 출력문은 제일 먼저 만나죠. 이 책에서도 첫 번째 프로그램인 "Hello, World"에서 Console.WriteLine("Hello, World!"); 를 사용했어요. Console.WriteLine("Hello, World!"); 이번 장에서는 Console 클래스를 이용하여 출력하는 방법과 일력받는 부분에 관하여 알아볼게요. 3.1 서식 지정 문자열 Console.WriteLine 메서드에 다양한 인자를 원하는 형태로 출력하려면 첫 번째 입력 인자로 서식 지정 문자열을 전달해야 합니다. 수나 날짜, 열거형 등을 원하는 형태로 출력할 때 효과적이죠. 서식 지정 문자열은 인덱스, 배치, 포멧 문자열로 구성합니다. {index [,alignme..

C#/디딤돌 C# 2024.01.22

Part 29. 도서 관리 프로그램 I - 시나리오 및 기본 메뉴 구현

Part 29. 도서 관리 프로그램 I - 시나리오 및 기본 메뉴 구현 101. 도서 관리 프로그램 실습 시나리오 도서 관리 프로그램 시나리오 - C언어 전산 기술은 빠르게 발전하고 새로운 기술과 개발 공정이 나오고 있어요. 여기에서는 시나리오를 소개한 후에 요구 분석하고 설계한 후에 구현하는 공정으로 진행할게요. 요구 분석에서는 프로그램의 외부 요소와 프로그램 사이의 상호 작용을 분석해요. 외부 요소가 언제 프로그램을 사용하는지 혹은 프로그램이 외부 요소를 언제 사용하는지 파악하죠. 그리고 분석 결과를 유즈케이스(Usecase) 다이어그램으로 작성할거예요. 설계 단계에서는 역할에 따라 사용자 정의 형식을 결정하고 형식 간의 관계를 정의해요. 그리고 유크케이스 별로 시퀀스를 정의하죠. 사용자 정의 형식과..

Part 28. main 함수 매개 변수

Part 28. main 함수 매개 변수 main 함수 매개 변수 100. main 함수 매개변수 이번에는 main 함수 매개 변수를 사용하는 방법을 살펴보아요. main 함수는 프로그램 진입점 함수로 프로그램의 개발자가 작성한 코드 중에서 제일 먼저 수행하죠. main 함수는 시작하면서 인자와 환경 변수를 받아 사용할 수 있고 종료 결과를 반환할 수 있어요. int main(int argc,char **argv, char **env); main 함수는 전달한 인자와 환경변수를 선택적으로 사용할 수 있어서 개발자는 다양한 형태의 원형을 갖는 main 함수 중에 한 가지 형태로 정의하여 사용할 수 있어요. int main(int argc, char **argv, char **env); void main(i..

[C#] 2. 기본 형식 II - 다양한 정수 형식, 실수 형식

2.4 다양한 정수 형식 C#은 다양한 정수 형식을 제공합니다. 1바이트인 sbyte, byte와 2바이트인 short, ushort, 4바이트인 int, uint, 8바이트인 long, ulong을 제공합니다. 정수 형식에는 정적 멤버로 MinValue와 MaxValue 속성을 제공합니다. 이를 통해 표현 범위를 알아봅시다. using System; namespace _03.정수_형식 { internal class Program { static void Main(string[] args) { Console.WriteLine("sbyte:{0} ~ {1}", sbyte.MinValue, sbyte.MaxValue); Console.WriteLine("byte:{0} ~ {1}", byte.MinValue..

C#/디딤돌 C# 2024.01.22

[C#] 2. 기본 형식 I - 메모리 크기 확인, 논리 형식 bool, 문자 형식 char

다루는 내용 2.1 메모리 크기 2.2 논리 형식 bool 2.3 문자 형식 char 2. 기본 형식 C#에서는 관리할 데이터를 표현하기 위해 형식과 변수를 제공합니다. 형식은 표현할 데이터 종류를 약속한 것입니다. 이러한 형식은 변수 선언이나 개체 생성을 통해 구체화합니다. 변수는 구체화 한 데이터에 접근하기 위해 사용하는 것입니다. C#에서 형식은 이미 제공하는 기본 형식과 개발자가 정의해서 사용하는 사용자 정의 형식이 있습니다. 다음은 System namespace에 정의한 기본 형식입니다. C# 형식에는 기본 형식과 사용자 형식이 있다고 하였습니다. 이 중에 사용자 형식에는 클래스, 구조체와 열거형이 있어요. 이들에 대해서는 뒤에서 다시 자세하게 다룰게요. 형식은 분류 방법에 따라 값 형식, 참조..

C#/디딤돌 C# 2024.01.19

1. C# 소개

1. C# 소개 안녕하세요. 언제나 휴일입니다. 컴퓨터 혹은 스마트 기기 등에서 동작하는 프로그램을 만들 때 사용하는 언어는 매우 다양합니다. 그 중에서 .NET Framework에서 동작하는 프로그램을 만들 때 가장 추천하는 언어는 C#입니다. .NET Framework는 마이크로소프트 사에서 개발한 윈도우즈 프로그램 개발 및 실행 환경입니다. 개인용 컴퓨터 뿐만 아니라 다양한 스마트 기기에 설치하여 사용할 수 있습니다. 당연히 C# 언어를 이용하면 개인용 컴퓨터를 비롯하여 다양한 기기에서 동작 가능한 프로그램을 개발할 수 있습니다. (물론 우리나라에서 .NET Framework는 거의 Windows O/S를 탑재한 컴퓨터 환경입니다.) .NET Froawork 에는 공통으로 제공하는 라이브러리를 포함..

C#/디딤돌 C# 2024.01.18

Part 27. 파일 입출력 - fread, fwrite, fseek, ftell 함수

Part 27. 파일 입출력 - fread, fwrite, fseek, ftell 함수 97. 바이너리로 파일 입출력 C언어 파일 입출력, fread, fwrite 이번에는 메모리를 덤프하는 입출력 함수를 살펴볼게요. size_t fread(void * buf, size_t element_size, size_t count, FILE * fp); size_t fwrite(void * buf, size_t element_size, size_t count, FILE * fp); 메모리를 덤프하는 입출력 함수는 내용을 그대로 파일 입출력하는 함수들이예요. 메모리 덤프하는 입출력 함수는 fread와 fwirte 함수가 있어요. 두 함수는 입출력 방향이 메모리에서 파일스트림과 파일스트림에서 메모리라는 점이 다를 뿐..

Part 26. 파일 입출력 함수와 ASCII 문자로 입출력하기

Part 26. 파일 입출력 함수와 ASCII 문자로 입출력하기 95. 파일 입출력 – fopen, fclose C언어 파일 입출력 함수, fopen, fclose 이번에는 표준 입출력 라이브러리 사용 방법을 살펴볼게요. C언어에서는 파일 입출력을 할 수 있게 표준 입출력 라이브러리와 콘솔 입출력 라이브러리 등을 제공하고 있어요. 개발자가 O/S에서 제공하는 시스템 호출을 사용해서 파일 I/O 작업을 할 수도 있어요. 하지만 시스템 호출은 섬세한 제어가 필요하죠. 파일 입출력 라이브러리를 사용하는 것으로도 대부분 처리가 가능해요. 파일 입출력 작업을 하려면 먼저 작업할 파일을 열고 마친 후에는 닫아야겠죠. 표준 입출력 라이브러리에서는 원하는 파일을 열 때 사용하는 여러가지 함수를 제공하는데 대표적인 함수..

Part 25. 사용자 정의 동적 배열 사용(순차 보관, 인덱스로 보관)

Part 25. 사용자 정의 동적 배열 사용(순차 보관, 인덱스로 보관) C언어 사용자 정의 동적 배열 사용, 순차 보관, 인덱스로 보관 91. 동적 배열 사용 예 – 동적 개체 정의 테스트를 위해 사용할 자료는 회원 번호와 이름을 멤버로 갖는 회원 데이터로 할게요. typedef struct _Member Member; #define MAX_NAME_LEN 20 struct _Member { int mnum; char name[MAX_NAME_LEN+1]; }; 그리고 동적으로 생성하는 함수, 소멸하는 함수, 출력하는 함수를 제공하세요. ◈ Member.h #pragma once typedef struct _Member Member; #define MAX_NAME_LEN 20 struct _Member..

Part 24. 사용자 정의 동적 배열 만들기

Part 24. 사용자 정의 동적 배열 만들기 C언어 사용자 정의 동적 배열 만들기 88. 사용자 정의 배열 개요 프로그래밍을 하다 보면 C언어에서 제공하는 형식 배열로 자료를 관리하는 것으로는 한계에 부딪힐 때가 있어요. 예를 들어 회원 관리 프로그램에서 최대 몇 명의 회원을 관리할 것인가를 개발 단계에서 결정할 수 없을 때도 많아요. 프로그램을 사용하는 사용자가 원하는 만큼 관리를 해야 할 때도 있어요. 그리고 프로그램이 알아서 자료를 관리할 공간을 늘려주면 더 좋겠죠. 이 때 동적 메모리 할당을 이용하여 프로그램을 작성하면 가능하겠죠. 이번에는 동적 메모리 할당 함수를 이용하여 확장 가능한 동적 배열 구조체와 관련 함수를 만드는 실습을 할 거예요. C언어에서 제공하는 형식 배열은 컴파일 시점에 원소..

Part 23. 동적 메모리 할당 malloc, calloc, realloc, free

Part 23. 동적 메모리 할당 malloc, calloc, realloc, free C언어 동적 메모리 할당, malloc, calloc, realloc, free 82. 동적 메모리 할당 함수과 void * C언어에서는 데이터를 관리하기 위해 메모리를 할당받는 방법으로 변수 선언을 제공하고 있어요. 그런데 변수 선언으로 메모리를 할당받는 것은 컴파일러 시점에 할당할 메모리 크기를 결정해요. 물론 실제 메모리를 할당하는 시점은 프로그램이 실행 중에 할당하지만 할당할 크기를 결정하는 것은 컴파일 시점이예요. 그런데 프로그래밍하다 보면 할당할 메모리 크기를 컴파일 시점이 아닌 프로그램 실행 중에 결정할 때도 있어요. 학생 관리 프로그램에서 최대 관리할 학생 수를 최종 사용자가 결정할 수 있다면 개발자가 ..

Part 22. 사용자 정의 형식(구조체, 공용체, 열거형) 실습

Part 22. 사용자 정의 형식(구조체, 공용체, 열거형) 실습 사용자 정의 형식(구조체, 공용체, 열거형) 실습 77. 사용자 정의 실습 – 시나리오 프로그램을 작성할 때 사용자 정의 형식을 기준으로 소스 파일을 구분하여 개발하면 유지보수 비용을 줄일 수 있어요. 사용자 정의 형식을 헤더에 정의하고 해당 형식의 멤버에 영향을 주는 기능은 소스 파일에 정의하는 형태로 개발하면 개발 비용 뿐만 아니라 C++이나 Java, C#과 같은 OOP 언어를 익히는데도 도움을 줄 수 있죠. 여기에서는 학생을 사용자 정의 형식으로 정의하고 관련 기능을 소스로 정의하여 사용하는 실습을 진행할게요. 실습 시나리오 학생은 학번, 이름, 체력, 지력, 스트레스, 연속으로 공부한 횟수를 멤버로 갖는다. 학번은 순차적으로 부여..

Part 21. 사용자 정의 형식(구조체, 공용체, 열거형)

C언어 사용자 정의 형식(구조체, 공용체, 열거형)74. 구조체프로그래밍 언어에서는 공통적으로 사용할 기본적인 형식들을 제공하죠.그리고 프로그램 목적에 맞게 개발자가 형식을 정의하여 사용할 수 있는 문법을 제공하고 있어요.이러한 문법을 사용자 정의 형식이라 불러요.C언어에서 개발자가 형식을 정의하여 사용하는 문법에는 구조체, 공용체, 열거형이 있어요.구조체와 공용체는 여러 개의 멤버를 하나의 형식으로 묶어 사용할 수 있게 정의하는 문법이예요.그리고 열거형은 사용할 수 있는 값들을 열거하는 형식이죠.구조체는 C언어에서 가장 많이 사용하는 사용자 정의 형식이예요.여러 개의 데이터를 하나의 형식으로 묶어서 정의할 수 있어요.학생의 번호, 이름을 구조체로 정의하면 학생 구조체 변수 하나만 선언해서 번호와 이름을..

[C#] 미디 분석 프로그램 만들기– 5. 미디분석기 5.3 Final, 트리 뷰 상세 구현

1. 유튜브 동영상 강의 미디 분석 프로그램 - 미디 분석기, 트리 뷰 2. 해야 할 일 드디어 미디 분석 프로그램 마지막 강의입니다. 이번 강의에서는 TreeView에 청크의 내용을 상세하게 보여주는 부분과 노드를 선택하였을 때 대응하는 바이너리를 DataGridView에서 확인하기 쉽게 선택해서 보여주는 부분을 구현합니다. 3. MakeChunkNode 메서드 수정 미디 분석기 프로그램 MainForm.cs에서 MakeChunkNode 메서드를 수정합시다. chunk가 헤더인지 트랙인지에 따라 상세 노드를 만들어 매다는 메서드를 만들어 호출합시다. private TreeNode MakeChunkNode(Chunk chunk) { TreeNode tn = new TreeNode(chunk.ToStrin..

[C#] 미디 분석 프로그램 만들기– 5. 미디분석기 5.2 크로스 스레드 문제 해결 및 Hexa 값 보기

1. 유튜브 동영상 강의 미디 분석 프로그램 - 미디 분석기 2. 해야 할 일 이번 강의에서는 지난 강의에서 청크 목록을 ListBox에 추가할 때 발생하는 크로스스레드 문제를 해결할 거예요. 그리고 ListBox에 청크를 선택하면 청크의 원본 이진 데이터를 Hexa 값으로 DataGridView에 보여주는 작업을 할 거예요. 이 외에도 Header 클래스에 Division에 관한 코드를 수정합니다. 3. 크로스 스레드 문제 해결 크로스 스레드 문제는 폼이나 컨트롤을 생성한 스레드가 아닌 스레드에서 폼이나 컨트롤의 속성을 변경하는 등의 작업을 할 때 발생합니다. 이에 관한 자세한 사항은 크로스 스레드 발생 원인 및 해결하기를 참고하세요. 폼이나 컨트롤에는 InvokeRequired 속성을 갖고 있습니다...

[C#] 미디 분석 프로그램 만들기 – 5. 미디분석기 5.1 화면 배치 및 미디 파일 열기

1. 유튜브 동영상 강의 미디 분석 프로그램 - 미디 분석기 2. 해야 할 일 이전강의까지 미디 파일을 분석하는 ehmidilib를 만들었습니다. (*진행하면서 ehmidilib에 새로운 형식 및 기능을 추가합니다. *) 이번 강의부터 ehmidilib를 이용하는 미디분석기 프로그램을 작성하기로 합시다. 미디분석기 프로그램은 Windows Forms 앱(.NET Framework) 입니다. 이번 강의에서는 메인 폼에 컨트롤을 배치하고 미디 파일을 열어서 청크 목록을 보여주는 부분까지 구현할거예요. 미디 파일을 여는 작업을 위해 “파일 열기 대화상자”인 OpenFileDialog를 사용합니다. 미디 파일에 청크 목록을 분석하는 작업은 ehmidilib에 MidiParser 클래스를 추가하여 구현할 거예요...

[C#] 미디 분석 프로그램 만들기 – 4. 트랙 청크 4.6 System Event

1. 유튜브 동영상 강의 미디 분석 프로그램 - 트랙 청크 분석, System Event 2. System Event Message 현재 미디 파일에 헤드 청크와 트랙 청크를 분석하는 작업을 진행하고 있습니다. 현재 헤드 청크는 상세 분석하였고 트랙 청크도 메타 이벤트와 미디 이벤트는 분석하는 기능까지 구현했어요. 이번 강의에서는 시스템 이벤트를 분석하는 작업을 진행할게요. 앞에서 얘기했듯이 상태 바이트가 0xF0~FE까지가 시스템 이벤트입니다. 다음은 상태 바이트에 따른 시스템 이벤트에 관한 설명입니다. 0xF0 … 0xF7 ☞ System Exclusive Messages 상태 바이트 뒤에 제조사 ID가 오며 그 뒤에 오는 메시지는 가변적이며 맨 뒤에 0xF7이 옵니다. 0xF1 DD ☞ MTC Qu..

[C#] 미디 분석 프로그램 만들기 – 4. 트랙 청크 4.5 Midi Event 상세 구현

1. 유튜브 동영상 강의 미디 분석 프로그램 - 트랙 청크, 미디 이벤트 상세 분석 지난 강의에서 미디 이벤트를 분석하는 부분을 구현하였습니다. 이번 강의에서는 미디 이벤트의 상세 내용을 분석하기로 할게요. 2. 미디 이벤트 지난 강의에서 설명한 미디 이벤트 중에 이번에 상세 구현할 부분만 다시 설명하기로 할게요. Note off, Note on, Key after touch에서 F는 음 번호, S는 음 세기입니다. 음 번호를 12로 나누었을 때 몫은 옥타브이며 나머지는 음 이름입니다. Control Change에서 F는 컨트롤 번호이고 S는 새로운 값입니다. 컨트롤 번호에 대응하는 이름은 이전 글(MIDI 파일 MIDI 이벤트의 Control 데이터와 악기 이름)에 있어요. Program Change에..