C,C++76 [C++] 범위 내의 난수 생성하기 | 비결정적 난수 비결정적 난수 생성 [개요] C++ 11 이전엔 C 스타일의 rand() 함수를 이용하여 난수를 생성하였다. C++ 11부턴 C++ 스타일의 난수 생성 함수가 나왔으며 헤더 파일에 정의되어 있다. C 스타일의 난수 생성에 비해 난수의 형, 범위 등을 세세하게 조절할 수 있으며 기능적으로 많이 향상되었다. 난수 생성 방법에는 동일한 난수표를 사용하여 첫 실행 이후부터는 예측이 되는 방법과 매번 달라지는 난수 생성 방법이 있다. 여기선 매번 달라지는 비결정적 난수 생성 방법을 다룬다. 이 방법은 실제로 하드웨어 노이즈나 마우스 움직임 등을 통해 예측할 수 없는 난수 생성을 위한 리소스를 만들어 사용한다. [헤더 및 클래스 소개] 이라는 헤더 안에 난수 생성기와 난수 분포기 관련 클래스가 들어있다. 난수 생성.. 2020. 3. 5. [C++] 함수 템플릿 특수화 관련 링크 에러 | LNK1169, LNK2005 함수 템플릿 특수화하는데 컴파일은 정상적으로 되는데 링크 과정에서 계속 다음과 같은 에러가 발생 error LNK2005: ~~~ already defined in ~.obj fatal error LNK1169: one or more multiply defined symbols found 찾아보니 컴파일 후 만들어진 파일들로 linking 과정에서 하나로 합치려 할 때 중복되는 정의가 있을 때 발생한다고 함. 내 코드에선 다음과 같이 특수화 한 함수의 선언과 정의가 분리되지 않아서 발생하는 에러였다. // Foo.h template T Foo::Func() { ... } template float Foo::Func() { ... } 위 코드의 선언과 정의를 아래와 같이 헤더와 cpp파일로 분리해서 작성해.. 2020. 3. 2. [C++] 멤버 변수의 오프셋을 계산해주는 offsetof 매크로 #define offsetof(type, member) [매개 변수] type: 구조체 또는 클래스의 이름 member: 멤버 변수 이름 [반환값] type 내의 member의 offset을 계산하여 반환한다. C++ 17 미만은 type으로 오직 standard layout type 대해서만 그 기능이 정의되어있다. standard layout type이란 오직 C 스타일의 데이터로만 이루어진 데이터 구조 타입을 말한다. 예를 들면 기본 타입 int, float, double, char 등, 함수가 포함되지 않은 구조체가 그 예이다. C++ 17부턴 함수가 포함된 클래스의 멤버 변수의 오프셋도 계산할 수 있다. [예제] class Foo { public: Foo() = default; ~Foo() = .. 2020. 2. 29. [C++] 가독성을 위해 default와 delete 키워드를 사용하기 (클래스) 가독성을 위해 default와 delete 키워드를 사용하자 [배경] 클래스 작성 시 우리가 직접 작성하지 않아도 기본적으로 컴파일러가 생성해주는 것들이 있다. 그 대표적인 예로 기본 생성자, 기본 소멸자, 기본 복사생성자, 기본 대입 연산자 등이 그렇다. 기본적으로 컴파일러가 생성해준 복사생성자와 대입 연산자는 객체 복사 시 얕은 복사를 수행한다. 물론 멤버 변수가 값 형식일 경우 또는 주소를 그대로 복사해도 될 경우 깊은 복사를 하지 않아도 된다. 이 경우는 컴파일러가 알아서 만들어주는 것들을 써도 되기에 굳이 복사 생성자와 대입 연산자를 작성하지 않아도 되는 경우이다. 하지만 이는 코드를 짠 사람만 한눈에 이해할 수 있다. 게다가 코드가 매우 길다면 작성자 마저도 헷갈릴 수 있다. 또한 코드를 보는.. 2020. 2. 29. [C++] static_assert 매크로에 대해 알아보자. C++ 11에서 등장한 static_assert 키워드에 대해 알아보자. 기존 assert의 기능 자체에 대해선 간단한 소개만 할 것이니, assert에 대한 더 자세한 내용을 원하면 다음 포스팅을 참고하자. https://woo-dev.tistory.com/52 [assert 기능 및 목적] assert는 프로그램 개발 시 사용자의 실수를 개선해주기 위한 매크로로서, 어떤 조건을 인자로 받아 해당 조건이 거짓일 경우 프로그램을 중단시킨다. 이는 보통 프로그램 로직 상 일어나서는 안되는 조건을 인자로 넣어주어 프로그램 실행 시 assertion이 발생하면 그 조건을 찾아 디버깅 하는 것이다. assert는 프로그램 성능에 영향을 미치지 않으므로 많이 사용해도 상관없다. void main() { int n.. 2020. 2. 28. [C++] 소수점 n번째 자리에서 반올림 하기 | std::round 소수점 n번째 자리에서 반올림 하기 함수를 통해 직접 n번째 자리에서 반올림하는 것은 불가능하며, 첫째 자리에서만 반올림이 가능하다. 따라서 소수점 n번째 자리를 소수점 첫째 자리로 만들고 반올림 후 원상태로 복구할 것이다. ex) 23.1275 -> 소수점 셋째 자리에서 반올림 (1) 소수점 셋째 자리인 7에서 반올림하려면 우선 7이 소수점 첫째 자리가 되도록 한다. 23.1275 x 10^2 = 2312.75 (2) (1)의 결과를 헤더의 std::round 함수를 이용해 반올림(첫째 자리에서 반올림하는 함수) 2312.75 -> 2313 (3) 원래 자리수로 되돌리기 위해 (1)에서 곱했던 수(10^2)로 나눈다. (= 0.01 곱하기) 2313 x 0.01 = 23.13 2313 / 100.0 =.. 2020. 2. 26. 이전 1 ··· 4 5 6 7 8 9 10 ··· 13 다음