'분류 전체보기'에 해당되는 글 39건

  1. 2018.03.01 람다 식(익명함수)
  2. 2018.02.23 import
  3. 2018.02.23 스마트 포인터
  4. 2018.01.26 반복자 연산
  5. 2018.01.24 accumulate 함수
  6. 2017.12.16 CS2D
  7. 2017.11.17 기본 행렬 함수
  8. 2017.11.14 기본 벡터 함수
  9. 2017.11.09 함수인자
  10. 2017.10.12 API WORMS
posted by 구로보루 2018. 3. 1. 14:52

 람다 식은 호출되었거나 인수로서 함수에 전달된 위치에서 바로 익명 함수 개체를 정의하는 방법으로 일반적으로 알고리즘이나 비동기 메서드에 전달되는 코드를 캡슐화하는데 사용된다.

(https://msdn.microsoft.com/ko-kr/library/dd293608.aspx)

 

구성

[캡처 절] (매개변수 목록) mutable -> 반환타입 { 함수 정의 }

 

캡쳐 절

람다 표현식의 바깥 범위에서 캡처할 변수 목록

[=] -> 모든 자동 변수를 값으로 캡처해서 접근가능, 이용은 가능 변경이 불가

[&] -> 바깥 범위의 모든 변수를 참조로 접근가능, 본문에서 코드로 변경이 가능하기

   때문에 mutable 키워드가 필요없다.

[변수] -> 바깥에서 원하는 변수만 캡쳐

[&변수] -> 바깥에서 원하는 변수를 참조 캡쳐

[=, &변수] -> 변수만 참조 캡쳐, 나머지는 값으로 캡쳐

[&, 변수] -> 변수만 값으로 캡쳐, 나머지는 참조 캡쳐

 

매개변수 목록 : 람다가 호출될 때 람다에 표현식에서 넘겨받을 매개변수 목록

 

mutable : 값으로 캡처한 바깥 변수의 복제본을 수정 가능으로 표시하는 키워드, 생략가능

 

반환타입 : 반환되는 값이 없으면 void로 지정된다, 생략가능

'공부 > C++(STL)' 카테고리의 다른 글

vector 컨테이너  (0) 2018.03.29
array 컨테이너  (0) 2018.03.23
스마트 포인터  (0) 2018.02.23
반복자 연산  (0) 2018.01.26
accumulate 함수  (0) 2018.01.24
posted by 구로보루 2018. 2. 23. 14:04

python에서는 여러 모듈과 패키지를 임포트 할 수 있다.

import를 할 때 단순 import, from ~ import ~, import ~ as ~ 의 방법이 있다.

 

import

 import 모듈이름
 import 패키지이름.모듈이름

의 방법으로 임포트 하여 사용가능하다.

 

from ~ import ~

 from 모듈이름 import 함수이름

 from 패키지이름 import 모듈이름

의 방법으로 임포트 하여 사용가능하다.

 

import ~ as ~

 import 모듈이름 as 별명

의 방법으로 임포트 하여 모듈이름을 별명으로 지정해 사용가능하다.

'공부 > Python' 카테고리의 다른 글

함수인자  (0) 2017.11.09
list 자르기  (0) 2017.09.07
range 함수 / 2차원 리스트 일괄 초기화  (1) 2017.09.06
문자열 나누기  (0) 2017.09.06
posted by 구로보루 2018. 2. 23. 13:54

스마트 포인터는 원시 포인터를 모방한 템플릿 타입의 객체로 주소를 담고 사용가능하다.


원시 포인터와 차이점

1. 자유 공간에 할당된 메모리 주소만 저장

2. 산술연산 불가능


스마트 포인터의 이점

1. delete를 명시적으로 호출하지 않아도 자동으로 메모리 공간을 정리해 버그를 줄여준다.

2. null로 초기화 하지 않아도 디폴트 생성자가 자동으로 생성한다.

3. 허상 포인터를 효과적으로 예방할 수 있다.

4. 자동 가비지 컬렉션이 가능하다.




unique_ptr<T>


MSDN문서를 보면 '더 강력한 unique_ptr이 auto_ptr을 대체한다'고 나와있다.(https://msdn.microsoft.com/ko-kr/library/ew3fk483.aspx)

여러 객체가 같은 주소를 소유할 수 없기 때문에 객체에 대한 단일 소유권을 가질 수 있다.


객체 생성

 std::make_unique<T>()

memory 헤더에 정의되어 있고 함수에 인자를 통해 유니크 포인터를 반환하는 함수이다.


멤버 함수

 reset()

유니크 포인터가 가리키는 객체를 소멸시키는 함수이다.

인자가 없으면 단순 소멸이고 인자가 있으면 새 객체의 주소로 대체된다.

 


 

 release()

유니크 포인터가 가리키는 객체를 nullptr로 해제하고 해당 객체를 반환한다.

 

 

 swap()

두 객체를 교환한다.

 

 

 

 get()

주소를 반환한다.

 


 

shared_ptr<T>

 

자유공간에 있는 객체 하나에 대한 소유권을 공유할 수 있다.

 

객체 생성

 std::make_shared<T>()

memory 헤더에 정의되어 있고 함수에 인자를 통해 공유 포인터를 반환하는 함수이다.

 

멤버 함수

 reset()

유니크 포인터와 동일하다.

 

 unique()

객체의 인스턴스 개수가 1이면 true를 아니면 false를 반환

 

 use_count()

인스턴스의 개수를 반환다.

 

 

 

 

'공부 > C++(STL)' 카테고리의 다른 글

array 컨테이너  (0) 2018.03.23
람다 식(익명함수)  (0) 2018.03.01
반복자 연산  (0) 2018.01.26
accumulate 함수  (0) 2018.01.24
static 멤버  (0) 2017.09.05
posted by 구로보루 2018. 1. 26. 16:23

※ advance


void advance (InputIterator & it, Distance n);

it : 이동할 반복자

n : 반복자를 이동할 값





※ distance


typename iterator_traits<InputIterator>::difference_type

 distance (InputIterator first, InputIterator last);

first : 시작 위치

last : 끝 위치


반환 : 두 반복자의 범위에 존재하는 원소들의 개수


 



next


ForwardIterator next 

(ForwardIterator it, typename iterator_traits<ForwardIterator>::difference_type n = 1);

it : 기준이 될 반복자(순방향 기능이 있는 반복자 가능)

n : 이동할 값


반환 : it 에서 n만큼 증가한 반복자 반환 





prev


BidirectionalIterator pre

(BidirectionalIterator it,

typename iterator_traits<BidirectionalIterator>::difference_type n = 1);

it : 기준이 될 반복자(양방향 기능이 있는 반복자 가능)

n : 이동할 값


반환 : it 에서 n만큼 감소한 반복자 반환 



'공부 > C++(STL)' 카테고리의 다른 글

람다 식(익명함수)  (0) 2018.03.01
스마트 포인터  (0) 2018.02.23
accumulate 함수  (0) 2018.01.24
static 멤버  (0) 2017.09.05
const  (0) 2017.09.05
posted by 구로보루 2018. 1. 24. 17:00

accumulate 함수는 numeric 해더에 포함되어 있고 원소들의 합을 계산한다.


Type accumulate(
      InputIterator _First,
      InputIterator _Last,
      Type _Val

);

Type accumulate(
      InputIterator _First,
      InputIterator _Last,
      Type _Val,
      BinaryOperation _Binary_op

);


 이렇게 두가지 형태로 되있는데 후자는 아직 사용을 안해봤기에 추후에 추가하기로 하고,

전자의 경우 _First는 시작원소, _Last는 마지막 원소, _Val은 초기값이다.


1,2,3,4,5를 원소라 가지고 있는 vector v 를 가정할 때

accumulate(v.begin(), v.end(), 0) -> 결과값 15

accumulate(v.begin(), v.end(), 100) -> 결과값 115

가 된다.


추가로 

cout

<< accumulate(istream_iterator<int>(cin), istream_iterator<int>(), 0)

<< endl;

의 방식을 사용하게 되면 Ctrl Z를 입력할 때 까지 공백기준의 모든 값을 더해 출력할 수 있다.

(위의 방식을 사용하려면 iterator 해더가 필요하다.

'공부 > C++(STL)' 카테고리의 다른 글

스마트 포인터  (0) 2018.02.23
반복자 연산  (0) 2018.01.26
static 멤버  (0) 2017.09.05
const  (0) 2017.09.05
private, protected, public  (0) 2017.09.02
posted by 구로보루 2017. 12. 16. 23:12

 

 

 DirectX를 배웠으면서 만든 게임이다. 캐릭터의 회전 등 DirectX의 백터와 행렬을 잘 사용할 수 있다고 추천을 받아 이 장르를 선택해서 만들었다.

 

 이번에는 별 이상한 문제를 많이 겪었는데 대표적으로 0xc0000005문제인데 해결을 하고 싶어도 이 문제가 일정한 상황에서 발생하는게 아니라 항상 다른곳에서 이 문제가 발생해서 도저히 해결을 못하겠다. 이게 내가 해결을 할 수 있는건지도 모르겠는게 처음 내 노트북에서는 이런 오류없이 돌아간다.(한번도 안떳음) 근데 학원컴퓨터는 연속으로 2번 게임을 하면 2번째 게임이 끝날 때 불러온 이미지 파일정보를 제거할 때 일어난다. 그리고 중간에 내 노트북을 포맷했는데 포맷한 후 노트북에서는 정말 무작위로 한번씩 뜬다.(3번 게임을 해도 안뜨기도 하고 시작하자마자 뜨기도 하고..) 그리고 대학교 프로젝트실 컴퓨터에서는 또 잘 돌아가더라.....

 

 아무튼 DirectX를 드디어 배우고 활용했다는 점에서 발전을 할 기회가 되었던 포폴이다.


 

posted by 구로보루 2017. 11. 17. 18:35

D3DXMatrixIdentity(D3DXMATRIX * pOut)

단위행렬을 생성하는 함수이다. 보통 행렬을 초기 생성하기 위해 사용된다.

단위행렬을 [1,1][2,2][3,3][4,4] 위치의 값이 1이고 나머지는 0인 행렬

pOut -> 생성될 단위행렬

 

 

D3DXMatrixTranslation(D3DXMATRIX * pOut, FLOAT x, FLOAT y, FLOAT z)

이동할 값을 저장하는 행렬이다.

pOut -> 생성될 행렬

x, y, z -> 이동할 목적지

 

 

D3DXMatrixScaling(D3DXMATRIX * pOut, FLOAT x, FLOAT y, FLOAT z)

크기의 값을 저장하는 행렬을 생성하는 함수이다.

pOut -> 생성될 행렬

x, y, z -> 크기의 배수

만약 -1의 경우 반대로 그려진다.

 

 

D3DXMatrixRotationZ(D3DXMATRIX * pOut, FLOAT Angle)
Z축 기준으로 회전하는 행렬을 생성하는 함수이다.

pOut -> 생성될 행렬

Angle -> 회전 각

 

 

D3DXMatrixInverse

(D3DXMATRIX * pOut, FLOAT * pDeterminant, CONST D3DXMATRIX * pM)

역행렬을 생성하는 함수이다.

pOut -> 생성될 행렬

pDeterminant -> 행렬의 행렬식을 포함을 포인터. 행렬식이 불필요한 경우 null

pM -> 역행렬을 계산할 기본 행렬

'공부 > DirectX' 카테고리의 다른 글

기본 벡터 함수  (0) 2017.11.14
posted by 구로보루 2017. 11. 14. 18:13

D3DXVECTOR3

다이렉트에서 벡터를 생성하기 위한 구조체이다.

기본적으로 FLOAT형의 x, y, z가 저장되어 사용한다.

 

 

D3DXVec3TransformCoord

사용하는 벡터를 행렬과 연산하는 함수이다.

(D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, const D3DXMATRIX *pM)

pOut -> 계산된 벡터

pV -> 행렬과 계산할 벡터

pM -> 계산할 행렬

를 인자값으로 받는다.

 

보통 행렬은 4x4 행렬이 기본인데 여기서 벡터는 x, y, z 3가지 이기 때문에 TransformCoord의 경우 맨 마지막에 1을 추가하여 행렬과 연산한다.

 

 

D3DXVec3TransformNormal

Coord와 마찬가지로 사용하는 벡터를 행렬과 연산하는 함수이다.

(D3DXVECTOR3 *pOut, const D3DXVECTOR3 *pV, const D3DXMATRIX *pM)

pOut -> 계산된 벡터

pV -> 행렬과 계산할 벡터

pM -> 계산할 행렬

를 인자값으로 받는다.

 

TransformNormal의 경우 맨 마지막에 0을 추가하여 x ,y, z, 0 벡터를 행렬과 연산한다.

 

 

D3DXVec3Normalize

백터의 크기를 1로 만들어서 정규화 한다. 크기와 상관없이 단순한 방향을 통해 각도를 계산하기 편리하다.

 

 

D3DXVec3Length

백터를 인자로 전달해 길이를 반환한다.

 

D3DXVec3Dot

벡터를 인자로 전달해 각도를 반환한다.

 

D3DXToRadian / D3DXToDegree

위의 두개는 메크로인데 각각

각도를 라디안으로

라디안을 각도로

변환하는 매크로이다.

'공부 > DirectX' 카테고리의 다른 글

기본 행렬 함수  (0) 2017.11.17
posted by 구로보루 2017. 11. 9. 22:38

 파이썬에서도 기타 다른 프로그래밍언어처럼 함수를 만들고 인자를 전달할 수 있다.

 우선 아래의 그림처럼 단순히 인자의 더한값을 출력하는 함수를 만들고 호출하면 여타 다른 언어의 함수와 똑같은 구조로 진행된다.

 

 

 

 그리고 파이썬에서도 기본인자를 설정하여 값을 대입하지 않았을 경우에 기본이 되는 값을 지정할 수 있다.

 

 위의 기본인자를 통해 func함수를 호출할 때 어떤값도 대입하지 않으면 기본인자인 a=10과 b=6을 통해 16이 출력된다. 기본인자를 사용할 때에는 보통 함수의 인자를 전달할 때 순서에 따라 대입이 되므로 반드시 뒤에서 부터 선언해야 된다.

 

 그리고 인자의 이름을 이용해 순서에 상관없이 값을 전달할 수 있는데 이를 사용하기 위해서는 해당 함수의 인자이름을 알아야 한다.

 

 

 

 위의 그림처럼 함수를 호출할 때 인자의 이름에 맞게 대입하게 되면 해당 인자로 값이 들어간다. 만약 이름을 대입하지 않으면 그냥 순서대로 대입된다. 여기서 주의할 점은 이름을 통해 인자값을 전달할때 기본인자로 설정되지 않았다면 모두다 이름을 통해 인자를 대입해야 된다. 만약 인자이름으로 하나의 값을 전달하고 나머지는 그냥 전달한다면 Syntax Error가 발생하게 된다.

 

 다음은 가변인자이다. 가변인자를 설정하기 위해서는 함수의 전달인자에 *을 붙여주면 된다. 그렇면 가변인자가 되어 여러개의 값을 전달받아도 튜플로 저장하게 된다.

 

 

 

 마지막으로 미정 키워드 인자이다. **을 붙여줌으로 해당 인자를 표시할 수 있고, 위의 가변인자튜플로 여러개의 값을 받는다면 미정 키워드 인자 key값과 value값을 받아서 딕셔너리 형태로 여러개의 값을 전달 받는다.

 

 

 

 가변인자미정 키워드 인자 여러개의 값을 받을 수 있기 때문에 일반 인자보다 반드시 뒤에 와야지 에러없이 사용할 수 있다. 그러므로 만약 위의 인자들이 모두 사용되려면

함수 (인자, 기본인자, 가변인자, 미정 키워드 인자) 순으로 사용해야 한다.

'공부 > Python' 카테고리의 다른 글

import  (0) 2018.02.23
list 자르기  (0) 2017.09.07
range 함수 / 2차원 리스트 일괄 초기화  (1) 2017.09.06
문자열 나누기  (0) 2017.09.06
posted by 구로보루 2017. 10. 12. 23:18

 

 액션슈팅게임 웜즈를 모방해서 만든 게임으로 이름도 매우 단순하게 API를 사용한 웜즈 API WORMS라고 했다.

 

 제작기간에 추석이 껴있어서 당초 계획한것에 비해 조금씩 게임의 규모를 줄여나간 슬플 제작기간이였다.(ㅜ.ㅜ) 그래서 그 긴 휴일 기간에 제대로 논것도 그렇다고 제대로 프로젝트를 진행한것도 아니게 되었다...

 

 아무튼 Unity를 사용할 때는 항상 그냥 되는구나 하다가 오브젝트 생성, 삭제, 검색 등을 일일이 관리하려다 보니까 난이도가 확 뛴다는 것을 느꼈다.  게임 내부에 거의 모든것을 관리하다 보니 실력이 는다는게 확실하게 느껴졌지만 그만큼 머리도 아프다. FMOD를 통해 소리를 사용했고 UI는 맘에 드는게 없어서 수준이 좀 낮지만 직접 원하는 문구로 만들었다. Unity의 편의성을 많이 느끼게해준 포폴.....