728x90
반응형

Program Language 192

[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

[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

[C#] C++로 만들어진 OCX 사용하기

C++로 ActiveX를 만든 뒤, 메서드나 속성을 등록하면 아래와 같은 형식이 된다. // Primary dispatch interface for CtopgraphCtrl [ uuid(E46EECAA-BACD-41EC-A75F-0D463AABA133) ] dispinterface _Dtopgraph { properties: [id(1000)] DOUBLE ScaleX; methods: [id(DISPID_ABOUTBOX)] void AboutBox(); [id(1)] void CreateGraph(BSTR name, LONGLONG color); [id(2)] void DeleteGraph(BSTR name); [id(3)] void Clear(); [id(4)] void AddData(BSTR nam..

Program Language/C# 2022.10.26

/SAFESEH (이미지에는 안전한 예외 처리기가 있습니다.)

https://learn.microsoft.com/ko-kr/cpp/build/reference/safeseh-image-has-safe-exception-handlers?view=msvc-170 /SAFESEH(이미지에 안전한 예외 처리기 포함) 자세한 정보: /SAFESEH(이미지에 안전한 예외 처리기가 포함됨) learn.microsoft.com 오늘은 컴파일을 시도하려는데 처음 보는 에러가 발생했다. 분명 예전에는 발생하지 않았는데, VS 버전이 바뀌어서 그런 것 같기도 하다. 해당 페이지에서는 속성/링커/고급에서 안전환 예외 처리 속성을 변경하라고 되어 있다. 하라는 대로 하니 컴파일이 정상 진행되었다. x86 대상에 연결할 때만 유효하다고 하는데, 자세한 것은 잘 모르겠다.

[C++] List 에서 pair로 된 데이터 찾기

list를 사용하다가 두 개의 데이터를 담아야 해서 pair를 사용했다. 찾을 때는 통상 first로 찾았는데, 이는 사실 map을 이용하는 편이 훨씬 편하다. list에서 pair를 사용하여 둘 다 만족하는 데이터를 검색하는 약간의 뻘짓을 해보았다. #include #include #include #include using namespace std; int main() { list list1; list1.emplace_back("1", "1"); list1.emplace_back("2", "1"); list1.emplace_back("2", "3"); string row = "2"; string col = "1"; auto func = [row,col](pair const & b) { return b...

[C#] C++ 구조체 사용하기

C#에서 C++의 Lib를 사용해야 하는데, 데이터의 양이 많아서 구조체를 사용해야 했다. 구글링 해보니 정말 많은 글들이 있었고 비슷비슷하면서도 조금씩 달랐다. 옵션들은 사용하지 않아도 되는 것들도 있었고 (성능 향상을 위한 옵션) 아무래도 처음 해보다 보니 쉽지 않았다. 우선 C#과 C++에서 동일하게 사용하는 int, char, double과 같은 변수들은 그냥 사용해도 되지만 대부분의 것들은 마샬링이라는 것을 통하여 사용해야 한다. C++에서 우선 구조체를 선언한다. #pragma pack(push, 1) typedef struct MOTION_PARAM2_T { int axisCount; int axisList[MotionMax_Axes]; double position[MotionMax_Axes..

Program Language/C# 2022.09.16

[C++] C#에서 사용할 수 있게 Lib 만들기

C#에서 사용 가능한 C++ 라이브러리를 만들려면 우선 CLR을 사용할 수밖에 없다. 우선은 Win32 Lib를 생성해야 한다. C#에서 사용할 수 있는 것은 Explicit Link임으로 extern "C" __declspec(dllexport)를 이용한 선언을 해줘야 한다. extern "C" __declspec(dllexport) int add_integer(int a, int b) { return a + b; } 이제, C# 콘솔 프로젝트를 만든다. C++프로젝트와 C# 프로젝트는 출력 폴더가 다르기 때문에, 테스트하려면 생성된 dll 파일을 옮겨줘야 한다. 우선 번거롭지 않기 위해서 C++ 출력을 C# bin 폴더로 지정했다. C#에서 외부 라이브러리를 가져오기 위해서 using System.R..

[C++] C#에서 사용할 수 있게 Lib 만들기 (CLR Class)

C#에서 C++을 만들려면 결국 둘 사이에 공통되는 부분을 이용해서 전달해야 하는 듯하다. CLR 클래스 라이브러리를 사용하면 조금 편하게 C#에서 사용할 수 있다. CLR 항목을 선택한 뒤 Class Library를 선택하면 만들 수 있다. 간단하게 더하기 함수를 만든다. namespace CLRClassLib { public ref class Calculator { public: int add(int a, int b) { return a + b; } }; } 그리고 테스트를 할 수 있도록 C# 콘솔 프로젝트를 만든다. Reference에서 추가를 눌러, 만들어 놓은 CLR 프로젝트를 등록하자. Reference에서 CLRClassLib이 추가되었다. using CLRClassLib을 작성한 뒤, CL..

[OpenGL] 텍스트의 검은 배경 없애기

OpenGL에서 글자를 사용하기 위해서 freetype을 사용하여 폰트의 데이터를 얻는다. 이때 얻어진 데이터는 1 Channel 데이터인 것 같다. 해당 데이터로 0이 아닌 부분에서 일일이 Pixel을 찍어서 표시하면 투명한 배경의 텍스트를 얻을 수 있지만 Zoom을 할 시 발생하는 문제와 함께 엄청난 부하가 발생한다. 이를 위해서 텍스쳐를 이용하면 배경이 검은색으로 표시된다. 이를 해결하기 위해서는 RGBA의 이미지 형식을 사용하면 된다. struct Color32 { unsigned char r; unsigned char g; unsigned char b; unsigned char a; }; for (int y = 0; y < chars.height; y++) for (int x = 0; x < c..

[OpenGL] GLAD 설치하기

https://glad.dav1d.de/ Extensions... glad.dav1d.de Glad 받기 버전이 많았지만 3.3으로 받았음. Language는 C/C++ , Profile은 Core으로 선택. Extensions는 뭔가 했는데 선택해주지 않아도 됨. Generate를 누르면 아래와 같은 파일이 생성됨. glad.zip만 다운로드하면 된다. 압축을 해제하면 해당 파일 모두 생성된다. zip 파일을 풀어서 자신의 include 폴더로 옮기면 된다. 그리고 경로를 추가해 준다. glad.c 파일을 프로젝트에 추가한다. 에러 C1853이 발생되는데, 여기서 멘붕이 살짝 올 수 있지만, 설정을 변경해 준다. 컴파일 후, 실행하면 정상 동작한다.

[C++] 소문자/대문자 변환 (tolower, toupper)

파일을 열 때 확장자 구분을 하려고 하니 대문자, 소문자에 모두 대응해야 해서 모두 소문자로 바꾼 상태에서 비교하기 위해서 사용하였다. std::wstring strExtension = strPath.substr(strPath.size() - 3, 3); for (int i = 0; i < strExtension.size(); i++) strExtension[i] = tolower(strExtension[i]); bool bSucs = false; // 확장자가 JPEG가 아니라면 진행하지 않는다. if (strExtension == L"jpg" || strExtension == L"jpeg") { .... 예제는 소문자로 변환하는 예제이며 대문자로 변환하려면 아래와 같이 하면 된다. for (int i..

728x90
반응형