728x90
반응형

전체 글 326

중심 정렬, 2point alignment

기판의 치수 변형으로 인해 발생하는 정렬 오차를 최소화하기 위해 이를 고려한 정렬 방법이 필요하다. 중심 정렬(center alignment)은 가장 널리 사용되는 알고리즘 중 하나다. 2 point alignment 두 마크를 잇는 직선의 중심을 각각 p, q라고 하면 다음과 같이 정의할 수 있다. 정의된 중심점이 일치되도록 정렬해야 한다. p, q를 중심으로 회전할 수 있다면 간단히 계산할 수 있지만 회전은 회전 중심으로 회전하기 때문에 회전 후에 위치 이송량 dx, dy를 구해야 한다. 물론 두 직선의 각도를 구한 후 차를 구해도 된다. 회전 행렬을 이용하여 사이 각 만큼 회전을 하면 다음과 같은 모양이 된다. q' 는 다음과 같이 계산할 수 있다. 회전된 중심 q'과 기준 중심 p의 차이를 이용하..

[C#] warning MSB3274 : This is a higher version than the currently targeted framework

C#을 사용한 지가 얼마 되질 않아 기존 시스템을 다시 확인하는 것도 쉽지 않다. 분명 문제없이 되었는데 갑자기 되질 않는다. Visual Studio는 프레임워크 버전이 낮다고 계속 업데이트를 하란다. 그래서 4.6, 4.7, 4.8까지 해봤다. 그런데도 워닝이 사라지지 않는다. 워닝이 문제는 아니다. 워닝을 따라 잊는 수많은 error 가 문제다. 너무 간단한 문제였을까? 검색 결과가 없다. 그리고 알았다. C#은 프로젝트에 프레임워크 버전 설정하는 것이 있다는 것을.... 프로젝트 우클릭해서 속성을 누른 다음, 애플리케이션 탭에 들어가면 있다. 이로소 해결되었다. 참, 이 에러는 현재 프로젝트보다 높은 프레임워크로 제작된 레퍼런스를 사용하면 발생한다.

Program Language/C# 2023.10.13

[C++] STL map에서 erase 사용 시 주의점

for (auto itr = m_elems.begin(); itr != m_elems.end(); ++itr) { if (itr->second->locking && !ignore_locked_obj) continue; m_elems.erase(itr); } map을 사용하여 조건을 통한 삭제를 실행하려 했는데, runtime error가 발생한다. 조건을 만족하는 iterator가 나타났을 때 해당 iterator를 지워버리면 해당 iterator는 end가 되어 버렸다. erase 하면 pos 값이 날아가버려서 그런가 보다. 미리 복사해 둬야 에러를 발생시키지 않는다. for (auto itr = m_elems.begin(); itr != m_elems.end();) { if (itr->second->..

[C#] 파일 쓰기

C#에서 파일을 쓰는 방법은 System.IO.File에 있는 Write 함수들을 이용하거나 StreamWriter를 사용하면 된다. 둘 다 같은 기능이지만, 하나에 파일에 반복해서 내용을 기입한다면 StreamWriter를 사용하는 것이 편리하다. string[] lines = { "First line", "Second line", "Third line" }; System.IO.File.WriteAllLines(@"C:\Users\Public\TestFolder\WriteLines.txt", lines); string text = "A class is the most powerful data type in C#. Like a structure, " + "a class defines the data an..

Program Language/C# 2023.02.17

[C#] List의 Find

List의 Find는 검색 조건을 지정하여 List의 아이템을 검색할 수 있도록 해준다. 조건식에는 true/false를 리턴하는 조건문을 넣어주면 된다. int를 사용 시는 아래와 같다. 조건에 만족하는 값이 없을 경우에는 0을 반납한다. var list = new List() { 3, 2, 9, 8, 10, 3, 8 }; int number = list.Find(X => X > 5); Console.WriteLine(number); int number2 = list.Find(X => X > 10); Console.WriteLine(number2); class를 데이터 타입으로 사용할 시에는 조건에 만족하는 없을 경우 null을 반납한다. var list2 = new List(); list2.Add(n..

Program Language/C# 2023.02.17

[C#] ref 키워드, 참조

ref는 변수가 참조이거나 다른 개체의 별칭임을 나타낸다. ref 키워드는 정식 매개 변수를 변수여야 하는 인수의 별칭으로 설정한다. 즉, 매개 변수에 대한 모든 작업이 인수에서 수행된다. ref 매개 변수를 사용하려면 메서드 정의와 호출 메서드가 모두 ref 키워드를 명시적으로 사용해야 한다. static void FillArray(ref int[] arr) { if (arr == null) { arr = new int[10]; } arr[0] = 1111; arr[4] = 5555; } static void Main(string[] args) { int[] theArray = { 1, 2, 3, 4, 5 }; FillArray(ref theArray); Console.WriteLine("Array e..

Program Language/C# 2023.02.16

[C#] out 매개 변수 한정자

out 키워드는 ref 키워드와 비슷하지만 ref의 경우에는 변수를 전달하기 전에 초기화해야 한다. in이 호출된 메서드에서 인수 값 수정을 허용하지 않는 것을 제외하고 in 키워드와 동일하다. out 매개 변수를 사용하려면 메서드 정의와 호출 메서드 모두 명시적으로 out 키워드를 사용해야 한다. static void FillArray(out int[] arr) { arr = new int[5] { 1, 2, 3, 4, 5 }; } static void Main(string[] args) { int[] theArray; FillArray(out theArray); Console.WriteLine("Array elements are."); for (int i=0; i

Program Language/C# 2023.02.16

[C#] 구조체와 클래스

C#에서 클래스와 구조체는 C++ 에서처럼 큰 차이는 없다. C++에서 구조체는 기본적으로 public 클래스는 기본적으로 private이라는 것을 제외하면 그냥 동일하다고 생각하고 쓰는 편인데, C#은 그마저도 없어 보인다. // 구조체 public struct Person { public string Name; public int Age; public Person(string name, int age) { Name = name; Age = age; } } // 클래스 public class PersonClass { public string Name { get; set; } public int Age { get; set; } public PersonClass(string name, int age) { ..

Program Language/C# 2023.02.16

[C#] abstract class

C#도 C++처럼 abstract를 사용함으로써 가상 클래스를 만들 수 있다. 대신 C++에서 사용하던 virtual를 사용하지 않아도 된다는 점은 다르다. abstract/override 키워드를 사용하면 된다. C++의 final은 존재하지 않은 듯하고 sealed와 readonly, const를 사용하여 해결하는 것 같다. (이건 다음 공부 할 때) public abstract class Shape { private string name; public Shape(string s) { Id = s; } public string Id { get { return name; } set { name = value; } } public abstract double Area { get; } public over..

Program Language/C# 2023.02.16

멀티스레드의 장단점

멀티스레드의 장점 응답성 향상 : 한 스레드가 입출력으로 인해 작업이 진행되지 않더라도 다른 스레드가 작업을 계속하여 사용자의 작업 요구에 빨리 응답할 수 있다. 자원 공유 : 한 프로세스 내에서 독립적인 스레드를 생성하면 프로세스가 가진 자원을 모든 스레드가 공유하게 되어 작업을 원활하게 진행할 수 있다. 효율성 향상 : 어러 개의 프로세스를 생성하는 것과 달리 멀티스레드는 불필요한 자원의 중복을 막음으로써 시스템의 효율이 향상된다. 다중 CPU 지원 : 2개 이상의 CPU를 가진 컴퓨터에서 멀티스레드를 사용하면 다중 CPU가 멀티스레드를 동시에 처리하여 CPU 사용량이 증가하고 프로세스 처리 시간이 단축된다. 멀티스레드의 단점 멀티스레드의 경우 모든 스레드가 자원을 공유하기 때문에 한 스레드에 문제가..

운영체제 2023.02.13

fork() 시스템 호출 , exec() 시스템 호출

fork() 시스템 호출 fork() 시스템 호출은 실행 중인 프로세스로부터 새로운 프로세스를 복사하는 함수다. 커널이 제공하는 이 함수는 프로세스를 복사하는 일종의 시스템 호출이다. 예를 들면 크롬에서 어떤 페이지를 보다가 Ctrl + N 키를 누르면 크롬이 하나 더 실행된다. 이것은 새로운 크롬을 실행한 것이 아니라 현재의 크롬 프로세서를 복사한 것이다. fork() 시스템 호출을 하면 프로세스 제어 블록을 포함한 부모 프로세스 영역의 대부분이 자식 프로세서에 복사되어 똑같은 프로세스가 만들어진다. 단, 프로세스 제어 블록의 내용 중 일부가 변경되는데 변경되는 부분은 다음과 같다. 프로세스 구분자(PID) 메모리 관련 정보 부모 프로세스 구분자(PPID)와 자식 프로세스 구분자(CPID)가 바귄다. ..

운영체제 2023.02.13

[MFC] 중국어 읽어오기 (unicode, utf-lf)

Unicode 유니코드는 전 세계의 모든 문자를 컴퓨터에서 일관되게 표현하고 다룰 수 있도록 설계된 산업 표준이다. 이는 유니코드 협회가 제정한다. 현재 컴퓨터에서 널리 사용되는 거의 모든 문자를 포함하며 110만 개 이상의 코드 포인트를 지정할 수 있다. 제록스와 애플의 공동 작업이 시초라 알려져 있다. 이후 여러 기업이 참여한 임시 위원회가 구성되었고 IBM와 Microsoft를 비롯한 다수의 기업이 참가하여 1991년에 유니코드 컨소시엄을 설립하였고 현재 주도적인 여러 IT 기업이 여기에 참여하고 있다. Unicode 문서의 Header에 BOM(Byte Of Mark)을 확인하자 BOM은 Bye의 순서 표시다. Unicode의 파일이 시작되는 첫 부분에 보이지 않게, 2~3 Byte의 문자열을 추..

코드/MFC 2022.11.23

(테스트) 라인 검출

Vision Library에서 Line을 찾는 기능은 Pattern을 찾는 것만큼이나 중요하다. 기본적으로 대상물의 모서리를 찾아내거나, 대상물의 외곽을 찾는 것, 혹은 특정 모형을 찾아낼 때에도 사용할 수 있다. 이에 현재 Vision Library에 Line Detecting 기능을 추가하게 되었다. 현재 Scriber에서 이 기능을 사용하게 될 경우는 첫 번째로 글라스 모서리를 보고 정렬을 실시해야 하는 Edge Alignment와 Scribe를 실시한 이후, Scribe Key를 찾거나 Scribe Line을 찾을 때 사용하게 될 것이다. 이미지에서 Line을 찾는 대표적인 방법은 Hough Transform이다.이다 Hough Transform은 일치하는 Line의 방향성을 이용하여 Line을 ..

[NSIS] 환경변수 등록

NSIS로 라이브러리를 배포하게 될 경우에는 DLL의 경우 system32나 해당 응용프로그램과 같은 폴더에 존재해야 한다. 그렇지 않으면 직접 환경 변수를 설정해야 하는데, 이는 매우 귀찮은 일이 된다. nsis로 인스톨 프로그램을 제작하면 인스톨 시에 환경 변수를 등록할 수 있다. dll이 포함된 디렉터리를 환경 변수 path에 등록해 보자. Windows 버전에 따라 레지스터리 위치가 상이하지만 win 10 기준으로는 아래와 같다. SYSTEM\CurrentControlSet\Control\Session Manager\Environment 해당 레지스터에서 등록된 환경 변수 값을 읽어와 추가하고 싶은 디렉터리를 붙여서 다시 쓴다. Section -Post ReadRegStr $0 HKLM "SYST..

[C#] OCX에 포인터 데이터 넘기기

C#에는 기본적으로 포인터를 지원하지 않는다. 포인터를 사용하기 위해서 unsafe를 이용하던데, 기본적으로 사용하지 말라고 한 것을 굳이 사용해야 싶어서 구글링 해서 여기저기 검색해 보았다. 가장 간단한 방법으로 C++에서도 사용하던 것인데 포인터의 주소를 넘기는 것이다. 포인터의 주소는 32bit에서는 long으로 64bit에서는 __int64 혹은 long long으로 넘겨주곤 했다. C#은 모두 long long이다. 그렇기 때문에 OCX의 메서드를 만들 때에도 LONGLONG으로 만들어야 한다. void CtopgraphCtrl::AddArrayDataPtr(LPCTSTR name, LONG length, LONGLONG xPtr, LONGLONG yPtr, LONGLONG zPtr) 포인터의 ..

Program Language/C# 2022.10.26
728x90
반응형