프로그래밍
116함수 부분 제어 반환에 대해
C, C++에서는 함수의 모든 경로에서 반환하지 않아도 됩니다. #include int function(int n) { if (n == 1) { return 1; } } int main(void) { printf("%d \n", function(1)); printf("%d \n", function(2)); }이런 상황을 말합니다. function 함수는 항상 의도한 값이 반환되지 않습니다. warning C4715: 'function': 모든 제어 경로에서 값을 반환하지는 않습니다.컴파일하면 이런 경고가 나타납니다. C#의 경우 C와는 완전히 다른 언어지만, 모든 코드 경로에서 return 문이 있어야 합니다. 는 저도 반드시 적용되어야 한다고 생각하기에 꺼내봤습니다. using Syste..
프로그래밍/C 2020.07.08 Plorence[재]오토핫키 gdip_imagesearch (Gdip library 응용)
목차 준비물 0. 준비 1. 일반적인 사용 방법 1) 설명 2) 사용 예 2. 특정 구역 캡쳐 or 서치 3. 멀티 서치 예시 4. 특정 색 Trans 서치 5. 방향성 주기 6.굵은 픽셀 서치 준비물 gdip+ lib gdip_imagesearch lib (https://autohotkey.com/boards/viewtopic.php?t=982) 0. 준비 다운로드 혹은 lib를 작성해서 include 합니다. #include gdip.ahk #include gdip_imagesearch.ahk1. 일반적인 사용 방법 먼저 imagesearch 라이브러리의 모든 것인 한 줄의 코드를 설명해드리겠습니다. 변수를 넣는 란에 무엇을 넣는지 알려드릴게요. 1)설명 Gdip_ImageSearch(pBitmapH..
프로그래밍/Autohotkey 2020.06.19 3 PlorenceASP.Net Core로 웹사이트 만들어본 후기
저는 주력으로 웹 개발을 하는 사람도 아니고 디자인도 엉망입니다. 웹에 대해 아주 얕은 지식만 있습니다. 만들고 싶은 것도 있고 개인 소개용 웹사이트나 프로젝트에서 API 서버를 개발해야 될 일이 있었습니다. 여러 가지 찾다가 Django, Node.js, ASP.net(core) 세 가지였습니다. ASP.Net Core를 선택한 이유 매우 간단한 이유인데, 파이썬이나 자바스크립트보단 C#을 더 잘 알고 있었습니다. 파이썬은 거의 모르는 수준이고 자바스크립트는 어려운 문법까진 모르지만 간단한 것과 코드 수정 정도는 가능했습니다. 그에 반해 C#은 제가 만들고 싶은 것을 만들만한 수준은 되었습니다. 거기서도 ASP.Net을 택하느냐 ASP.Net Core를 택하느냐에 갈렸지만 크로스 플랫폼을 지원하는 AS..
프로그래밍/C# 2019.11.21 4 PlorenceC++ vector와 valarray, 그리고 array 중 뭘 써야 할까?
이 클래스들은 서로 다른 목적을 가지고 서로 다른 그룹들에 의해 개발되었습니다. 먼저 vector 템플릿 클래스는 컨테이너 클래스와 알고리즘으로 구성된 시스템의 일부입니다. vector 클래스는 정렬, 삽입, 재배치, 검색, 다른 컨테이너로의 데이터 전송, 그 밖의 조작과 같은 컨테이너 지향적인 액티비티들을 지원합니다. 반면에 valarray 템플릿 클래스는 수치 계산을 지향하며 STL의 일부가 아닙니다. (valarray 템플릿 클래스은 push_back(), insert() 메서드를 가지고 있지 않음.) 그러나 많은 수학적 연산에 대해 간단하고 직관적인 인터페이스를 제공합니다. valarray 템플릿 클래스은 객체의 내용을 합하는 sum() 메서드, 최댓값을 리턴하는 max() 메서드, 최솟값을 리턴..
프로그래밍/C++ 2019.11.07 PlorenceC++ 펑터 또는 펑크터(functor)
펑터 또는 펑크터라고 하는데, 여기선 펑터라고 하겠습니다. 많은 STL 알고리즘들이 펑터(Functor)라고 부르는 함수 객체(Function object)를 많이 사용합니다. 펑터는 함수처럼 ()과 함께 사용할 수 있는 객체입니다. 일반 함수의 이름, 함수를 지시하는 포인터, () 연산자가 오버로딩된 클래스 객체 모두 펑터가 될 수 있습니다. #include class Money { private: int _Money = 0; public: int operator()() { return this->_Money; } void operator()(int N) { this->_Money += N; } }; int main(void) { Money money; money(100); //void operator..
프로그래밍/C++ 2019.11.06 2 PlorenceC++ 생각보다 많이 모르는 삼항 연산자의 특성
https://docs.microsoft.com/ko-kr/cpp/cpp/conditional-operator-q?view=vs-2019 해당 문서만 봐도 해당 게시글에서 설명하는 것은 다봤다고 해도 무방합니다. exp1 ? exp2 : exp3; 라는 삼항 연산자가 있을 때.. exp2과 exp3의 타입이 동일하다면 lvalue이다. 당연히 exp2와 exp3도 lvalue일때를 말합니다. char A = 'a'; char B = 'A'; (1 ? A : B) = 'B'; C는 컴파일 에러가 발생하고 C++에서는 이것이 허용됩니다. exp2과 exp3의 타입이 다르다면 형 변환이 일어난다. 제가 삼항 연산자를 더 알아본 이유입니다. #include int main(void) { char Result =..
프로그래밍/C++ 2019.11.06 PlorenceC++ mutable 키워드
mutable 키워드는 특정 구조체나 클래스가 const로 선언되어 있다 하더라도 특정 멤버를 변경할 수 있음을 나타내는 데 사용할 수 있습니다. 예제 의도는 const 객체여도 int형 변수의 읽기/쓰기가 가능한 클래스를 만들려고 합니다. (cosnt의 의도를 완전히 무시하는 거라 좋지 못하고 불필요한 클래스입니다.) #include class TEST { private: int number; public: void SetNumber(int n) const { number = n; } int GetNumber() const { return number; } }; int main(void) { TEST test1; const TEST test2; test1.SetNumber(100); test2.SetN..
프로그래밍/C++ 2019.11.06 PlorenceC++ 일반화 프로그래밍과 반복자(iterator)
STL는 일반화 프로그래밍(generic programming)의 한 예입니다. 객체 지향 프로그래밍은 프로그래밍의 데이터 측면을 중시하지만, 일반화 프로그래밍은 알고리즘에 중점을 둡니다. 두 프로그래밍 패러다임에 공통적인 것은, 데이터의 추상화와 재활용이 가능한 코드의 작성입니다. 추구하는 철학은 완전히 다른데, 일반화 프로그래밍의 목적은 데이터형과 무관한 코드를 작성하는 것입니다. 템플릿은 일반화 프로그램을 작성하는 C++의 도구입니다. 이터레이터가 필요한 이유 이터레이터를 이해하는 것이 STL을 이해하는 열쇠입니다. 템플릿이 알고리즘을 저장할 데이터형과 무관하게 만드는 것처럼, 이터레이터는 알고리즘을 사용할 컨테이너형과 무관하게 만듭니다. 이터레이터는 STL의 일반화 접근에 필수 구성 요소입니다. ..
프로그래밍/C++ 2019.11.06 PlorenceC++ 표준 템플릿 라이브러리(STL) 의미
표준 템플릿 라이브러리(STL: Standard Template Library) 표준 템플릿 라이브러리는 컨테이너(Container), 이터레이터(iterator), 함수 객체(Function object), 알고리즘(algorihm)을 나타내는 템플릿의 결합을 제공합니다. 컨테이너는 배열과 같이, 여러 개의 값을 저장할 수 있는 구성 단위입니다. 알고리즘은, 배열을 정렬하거나 리스트에서 특정 값을 검색하는 것과 같은, 특별한 작업들을 수행하기 위해 사용하는 방법입니다. 이터레이터는 배열 안에서 포인터를 사용하여 위치를 옮기듯이, 컨테이너 안에서 위치를 옮길 수 있도록 도와 주는 객체들입니다.(즉 이터레이터는 포인터의 일반화.) 함수 객체는 함수와 비슷한 역할을 하는 객체입니다. 함수 객체는 클래스 객체..
프로그래밍/C++ 2019.11.06 PlorenceC++ 스마트 포인터(smart pointer)
smart pointer는 포인터처럼 행동하는 클래스 객체입니다. 스마트 포인터는 동적 메모리를 관리하기 위해 있는데 포인터 변수이 스택에서 해제된다면 지시하는 메모리 블럭도 같이 할당 해제가 됩니다. 스마트 포인터는 왜 필요한가? void test() { std::string * str = new std::string("Hello!!"); //작업후에 if (str->length() == 0) { throw std::exception(); } delete str; return; } 해당 함수는 예외가 발생하면 delete 구문은 실행할 수 없습니다. (예외가 발생할 수 없는 함수지만, 발생한다고 가정해봅시다.) 그래서 포인터 변수 str가 가리키는 메모리 블록은 할당 해제하지 않습니다. 결국엔 memo..
프로그래밍/C++ 2019.11.06 PlorenceC++ 데이터형 변환 연산자(cast 연산자)
C에서는 데이터형 변환이 너무 느슨합니다. 이러한 느슨함을 해결하기 위해 Stroustrup(C++ 개발자)는 일반적인 데이터형 변환을 허용하는 것을 공고히 하고 데이터형 변환 과정을 더욱 엄격하게 규정하는 4개의 데이터형 변환 연산자를 추가하였습니다. dynamic_cast const_cast static_cast reinterpret_cast dynamic_cast dynamic_cast를 쓸려면 프로젝트에서 RTTI옵션을 활성화해야 합니다. #include class Animal { public: virtual void Move() { std::cout
프로그래밍/C++ 2019.11.04 PlorenceC++ RTTI(Runtime Type Infomation or Runtime Type Identification)
RTTI는 RunTime Type Identification 또는 RunTIme Type Information의 약자로 실행 시간 데이터형 정보라는 뜻입니다. 오래된 C++은 대다수가 지원 안 하며 어떤 C++은 켜거나 끌 수 있는 옵션이 있습니다. (visual studio는 옵션이 있지만, 디폴트로 체크되어 있습니다. 만약 해제하고 사용한다면 런타임 에러가 발생합니다.) (프로젝트 우클릭 -> 속성 -> C/C++ -> 언어 -> 런타임 형식 정보 사용) RTTI RTTI의 목적은 프로그램이 실행 도중에 객체의 데이터형을 결정하는 표준 방법을 제공하는 것입니다. 기초 클래스부터 상속된 클래스 계층이 있다고 하면 어떤 클래스의 객체인지에 따라 다른 처리를 해야 한다면 RTTI를 사용해야 합니다. RTT..
프로그래밍/C++ 2019.11.04 Plorence