C/C++ 에서 작성한 코드를 C#에서 사용하기 위한 작업을 하던 중, 가변길이 포인터 배열에 대해 변환하는 방법에 대해 공유합니다. 샘플로 만든 C 코드는 아래와 같습니다. typedef struct { char *name; int age; } my_data; typedef struct { int len; my_data **data_list; } my_data_list; __declspec(dllexport) void print_my_data_list(my_data_list *list) { int i; if (!list) { printf("[ERROR] no list\n"); return; } printf("[INFO] list length : %d\n", list->len); for (i = 0; i..
탐색기구현1 - TreeView를 만들어보자! - 폼 왼쪽의 트리뷰 구현 해야할일 - 내 컴퓨터의 드라이브 목록 뽑아오기 - 윈도우가 로드되었을 때 시스템 드라이브목록 가져오기 - 노드가 확장될 때 서브 디렉토리 목록 가져와서 노드에 추가하기 1. 윈도우가 로드되었을 때 시스템 드라이브 목록 가져오기 void Window1_Loaded(object sender, RoutedEventArgs e) { // Root 드라이브 생성 foreach (string str in Directory.GetLogicalDrives()) { try { TreeViewItem item = new TreeViewItem(); item.Header = str; item.Tag = str; item.Expanded += new ..
#if, #endif 보다는 Conditional Attribute를 이용하라! 기존방법 예제 : #if, #endif 방법 private void Check() { #if DEBUG string name = new StackTrace().GetFrame(1).GetMethod().Name; Trace.WriteLine("Check for Person : "); Trace.WriteLine("called by " + name); #endif } 좋지 않은 점 : 1. Release모드일 때에는 메소드 내용이 포함되지는 않지만 쓸데없는 메소드 호출을 피할 수 없다. 2. 코더의 실수를 유발하여 의도하지 않은 코드가 삽입될 수 있다. 개선시킨 방법 예제 : Conditional Attribute 사용 방법 ..
강제 형 변환보다는 as, is가 좋다! C#에서도 C, C++, Java등에서 사용하던 강제 형 변환을 할 수 있다. 형 변환 예) void EventHandler(object obj, EventArgs e) { MyClass myClassByCast = (MyClass)obj; // cast사용 MyClass myClassByAs = obj as MyClass; // as 사용 } C#에서는 위처럼 object형을 형 변환해야 할 때가 종종 있다. 중요한 점은 위처럼 강제 cast를 하나 as키워드를 사용하나 그 결과는 같다는 것이다. 그렇다면 왜 as키워드를 사용해야 하는 걸까? 1. as나 is 연산자는 런타임에 객체의 형 변환이 가능한지를 확인하기 위해서 사용자가 정의한 형 변환 연산자를 고려하..
시스템함수 Beep(int frequency, int duration)을 이용하면 된다 Kernel32.dll을 임포트해서 사용할 수 있다. 예제소스 : /// /// 비프음을 내는 시스템 함수 /// /// 주파수 /// 비프음 길이(시간, 단위 : 1000 = 1초) [DllImport("KERNEL32.DLL")] extern public static void Beep(int freq, int dur); public static void Main() { // 출처 : 네이버 // 도 = 256Hz // 레 = 도 * 9/8 = 288Hz // 미 = 레 * 10/9 = 320Hz // 파 = 미 * 16/15 = 341.3Hz // 솔 = 파 * 9/8 = 384Hz // 라 = 솔 * 10/9 =..
[DllImport("user32.dll")] public static extern short GetKeyState(int keyCode); [DllImport("User32.dll")] public static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo); if ((Win32API.GetKeyState((int)Keys.CapsLock) & 0xffff) != 0) { Win32API.keybd_event((byte)Keys.CapsLock, (byte)0, 0, 0); Win32API.keybd_event((byte)Keys.CapsLock, (byte)0, 2, 0); } 설명 : Win32 API 함수 중에..
C#에서 다중배열은 크게 일반적인다중배열, 톱니배열로 나눌수 있습니다. 일반적인 다중배열은 각 차원을 한번에 설정해주어야 하고 각 차원마다의 크기가 같게됩니다. 톱니배열은 각차원의 크기를 다르게 설정해줄 수 있고, 차원의 크기를 실행중에 할당할 수 있습니다. 간단히 예제를 보시면 이해되실 수 있을거라 생각됩니다. int lv1 = 2; int lv2 = 3; int lv3 = 4; // 일반적인 다중배열 사용방법 double[,,] PanBuf; PanBuf = new double[lv1,lv2,lv3]; PanBuf[0, 0, 0] = 5.0; // 톱니배열사용(각 차원의 크기를 다르게 지정할 수 있음) // 톱니배열 사용 예 #1 - 각 차원마다 같은 크기 지정 // 1차원 - lv1, 2차원 lv2..
[질문 – C++에서의 CList를 C#에서 어떻게 구현하는가] 이번에 C#을 다루게 되었는데, MFC로 구현된 것을 C#으로 바꾸고 있습니다. 중간에 지금 막혀서 그런데 많은 답변 부탁드립니다;;; ㅠㅠ;; MFC의 CList 를 C#에서 List 으로 하는 표현방식이 맞는지 모르겟네요 오류는 나지않지만..... 그리고 MFC의 CList 클래스 GetHeadPosition(), GetNext() 를 C#으로 매칭시키는 함수가 궁금합니다;;; 아니면,,,, 구현하는 방법이라도 답변부탁드립니다;;;; ㅎㅎ [답변] List를 접근하는 방법은 열거자를 이용하는방법, 인덱스로 접근하는 방법, foreach문을 통해 접근하는 방법등이 있다. 간단한 예제를 작성해 보았다. 다음 3가지의 경우는 모두 같은 출력물..
유일무이한 인스턴스를 만들어 사용하기 프로그래밍을 하다 보면 여러 개의 클래스에서 한 개의 객체에 접근하고 싶을 때가 많습니다. 다음과 같은 클래스가 있다고 가정해봅니다. Code – Singleton.cs class Singleton { private int a; public Singleton() { a = 0; } internal void SetA(int val) { this.a = val; } internal int GetA() { return a; } } 간단한 클래스이니 주석이나 설명은 생략하겠습니다. 이 클래스의 객체를 생성하여 a값을 접근하는 두 개의 각각의 클래스가 있다고 생각해봅시다. Code – ClassA.cs class ClassA { Singleton singleton; publi..