'윤성우 열혈 TCP/IP 소켓프로그래밍' 도서를 따라하다 발생한 오류 이다

해당 오류는 'inet_addr' 함수를 사용할 때 발생하는 경고로, inet_addr은 문자열을 IP 주소를 처리하는 함수이다

해당 함수는 현재의 사용이 권장되지 않아서 발생한다.

 

해결 방법

1. inet_pton() 또는 InetPton() 함수를 사용

#include <WinSock2.h>
#include <Ws2tcpip.h>

// ...

const char* ipAddress = "127.0.0.1";
struct sockaddr_in sa;
if (inet_pton(AF_INET, ipAddress, &(sa.sin_addr)) != 1) {
    // 오류 처리
}

 

2. 이 경고를 무시하고 싶다면 _WINSOCK_DEPRECATED_NO_WARNINGS를 정의하여 비활성화

#define _WINSOCK_DEPRECATED_NO_WARNINGS
#include <WinSock2.h>
#include <Ws2tcpip.h>

// ...

 

 

ws2_32 라이브러리 추가

프로젝트 설정 들어가서 <추가 종속성>에 추가해주면된다

 

프로그램 입력 인자 설정

위 프로젝트 설정으로 가서 <명령 인수> 에다가 프로그램에 넣어줄 인자를 입력하면된다

 

https://sites.math.rutgers.edu/~ajl213/CLRS/CLRS.html

 

CLRS Solutions

 

sites.math.rutgers.edu

 

RUTGERS 대학에서 작성한 Introduction to Algorithms 솔루션 모음집이다

거의 정답에 가깝다고한다

'알고리즘' 카테고리의 다른 글

프로그래머스 - 게임 맵 최단거리 (c++)  (0) 2025.02.23
Lv. 3 나무 섭지 - C++  (0) 2024.12.10
Lv. 3 징검다리 - C++  (0) 2024.12.10
Lv. 3 함께하는 효도 - C++  (0) 2024.12.10
Lv. 3 자동차 테스트  (0) 2024.12.10

게임 수학 강의 정리

 

수직선


수직선 상에서 수를 빼면 왼쪽으로 이동하고, 더하면 오른쪽으로 이동한다

 

덧셈

덧셈은 좌우 연산에서 수의 위치를 변경해도 양변의 결과가 달라지지 않지만
 
ex) 1 + 5 = 5 + 1
 
 

뺄셈

뺄셈의 경우 좌우 연산에서 수의 위치를 변경하면 양변의 결과가 달라진다
 
ex) 1 -5  5 - 1
 

어림수

게임에서 적에게 데미지를 입힐때, 발생하는 데미지에 난수를 적용할때, 분명 낮은 데미지에서부터 시작을 해야할것이다. 거기서 발생하는 난수를 다룰때 방법으로
 
1. 다양한 난수들의 어림수를 미리 구하고, 계산을 할것인지
2. 난수들을 먼저 계산하고, 그 결과의 어림수를 구할것인지
 
이런 두가지 방법이 있다고 할때, 1과 2의 오차는 발생할수 밖에 없다는 것을 인지하고, 구현해야할것이다
 

곱셈

 
곱셈은 수직선 상에서 위와 같이 표현할수있다. 사분면에 따라 x와 y의 곱의 결과가 위에 표시한 것과 같다
 

나눗셈

이런 직사각형 블럭이 있다 한칸을 1로두고 2 x 4인 8의 블럭이 있다
 
여기서 8 / 2 = 4 를 표현하면 아래와 같다

선 하나를 그으면 절반으로 나뉘어진다
나누려는 숫자에 1을 뺀 만큼 선을 잘 그으면 된다

8 / 4 = 2는 왼쪽과 같이 2 / 8 = 1/4는 오른쪽과 같이 표현할수있다

수를 1로 나누면 그대로 인데 2/2 로 만들어 각 분자끼리 나누면 2/8이 1/4와 같다는 것을 수학적으로 확인할수있다
나눗셈을 아까전 곱셈에서 수직선상에서의 표현을 해보면, 부호에 있어서는 동일하지만, 나눗셈은 결과의 크기가 달라진다
 
특징 몇가지 수의 특징을 말하자면,
1. 덧셈이나 곱셈은 순서에 상관없다
2. 뺄셈은 순서에 따라 부호가 달라진다
3. 나눗셈에서 수의 순서에 따라 크기가 달라진다
4. 0으로 나누어서는 안된다. 
5. 몇몇 컴퓨터에서는 나눗셈이 곱셈보다 느릴수있다
6. 덧셈이나 곱셈은 수의 범위를 벗어날수있다
7. 뺄셈이나 나눗셈은 정확도(precision) 를 잃을수있다
 
 
 

나머지



어떤 수를 4로 나눈 나머지를 원에서 위와 같이 표현할수있다 존재 하는 모든 수에 대해서 계속 표시할수도있다
비슷한 예로 시계를 생각하면된다. 시계에서 초를 표현할때 수를 60으로 나눈 나머지를 원 둘레 상에 표시한것이다
이런식으로 나머지 연산을 통해서 턴제 게임에서 발생한 난수를 플레이어 수 만큼 나눠 누가 먼저 시작할지를 결정하는 등의 로직을 설정할수있다
 
 
 

BODMAS

BODMAS는 컴퓨터 연산 순서이다
 
Brackets - 괄호
Order - 위수 또는 I일때는 지수
Division - 나눗셈
Multiplication - 곱셈
Addition - 덧셈
Substraction - 뺄셈
 
미국에서는 PEMDAS라고 현실에서 계산하는 순서가 있다는데 BODMAS랑은 나눗셈 곱셈 순서가 다르다
컴퓨터에서는 곱셈보다 나눗셈이 먼저 연산되는 것을 기억해야한다
 
 

거듭제곱

3 * 6은 한 면이다
여기에 6을 또 곱하면? 직육면체가 된다
2^24을 계산해보자 대략 1600만 정도가 나오고 이값을 왜 계산해보라 하냐면
rgb에서 각각 8비트씩 할당받고, 색을 표현할수있는 총 수 가 2^24 라는 것이다
 
 

소수의 제곱

소수의 제곱을 그림으로 표현하고 그것을 식으로 표현하면 어떻게 할수있을까?

위의 그림은 3.5를 제곱 한것을 나타낸것이고, 3 이후에 0.5만큼은 초록색으로 표시했다
0.5 만큼 늘어난 부분에 대해서 3의 거듭제곱과 비교했을때 늘어나는 부피를 눈으로 직접 확인해볼수있다
그리고 이제 계산을 해보면 아래와 같이 표현할수있다
3.5^ 2
= 9 + 6 * 1/2 + 1/4
= 9 + 3 + 1/4
= 12.25
 

제곱근

제곱근에 대한 얘기를 해봅시다
제곱근은 몇제곱을 했을때 a 라는 값이 되는 수입니다
a * a * a = 4096 = 16 ^ 3
a = 16
육면체에서 얘기를 해본다면 육면체에서 시작이 되는 한 면을 찾는 것이라고 할수있습니다
그리고 (a^b)^c = a^(b*c) 이런 연산도 가능합니다
 

차트와 그래프

차트와 그래프를 그릴때는 제목을 붙여야한다
그리고 각 수직선에 해당하는 단위가 어떤것인지, 속도대 시간인지, 거리당 시간인지를 붙여야한다
미디어에서의 차트를 볼때, 0부터 시작하지 않고, 100부터 시작하고 102까지의 그래프를 보여준다 할때
엄청난 곡선이 존재하게 될수있는데, 그건 증가분이 과장되게 표현되었다는것이다
0부터 시작하지 않기에 일부분만 보여주고, 이런 증가폭이 존재했다 라는 식으로 알려준다
그러기에 항상 단위가 어떤것인지 잘 확인해야한다
 
 
 
Udemy Lecture
 
 
 
Book
 
1. Effective C++
2. Modern Effective C++
2. 아무도 알려주지 않은 C++ 코딩의 기술
3. 게임 개발자를 위한 물리
 
ETC
 
1. Directx 11
2. imGUI
3. Unity

[해당 글의 내용이 정확하지 않을 수 있습니다. 언제나 피드백 주시면 바로 반영하겠습니다.]

주로 인덱스를 다룰때, 그리고 음수가 들어갈수없는 변수의 경우 size_t 로 설정한다

그래서 for문이나 컨테이너의 크기를 받아올때 size_t를 사용해서 받게된다

그런데 binarySearch를 구현하다가 한가지를 발견하게되었는데,

size_t PmergeMe::binarySearch(int insertNum) {
	int low = 0;
	int mid;
	int high = _main.size() - 1;

	while (low <= high)
	{
		mid = low + (high - low) / 2;
		if (insertNum == _main.at(mid))
			return (mid);
		if (insertNum < _main.at(mid))
			high = mid - 1;
		else
			low = mid + 1;
	}
	if (insertNum > _main.at(mid))
		return (mid + 1);
	else
		return (mid);
}

이 이진 탐색에서 low와 high를 size_t로 변경하게되면, 이진 탐색을 수행하는 도중에 _main.at(mid)에서 예외를 던지게 된다

이유로는 high = mid - 1에서 underflow가 발생해서 size_t 최대값으로 설정되어버리는 것

그렇게 되었을때 while문의 조건이 low <= high 항상 참값을 갖게 되고, 내부에서 해당 벡터 컨테이너에 at으로 접근했을때, 범위를 초과한 곳에 접근하게 되어 std::out_of_range 예외를 발생시킴

 

1. size_t로 설정된 index를 다룰땐, 해당 함수 내부에 size_t로 설정된 값이 음수로 될 여지가 있는지 확인해야함

2. while문의 탈출 조건이 low <= high로 되어있긴한데, 같다는 조건이 붙어서 발생한 것이기도 하다. 하지만 이진탐색 특성상 접근 가능한 인덱스의 범위만 다루어야 하기때문에 해당 조건이 설정된것. 이 조건에 대해서도 한번 생각해야함

[해당 글의 내용이 정확하지 않을 수 있습니다. 언제나 피드백 주시면 바로 반영하겠습니다.]

 

복사 생성자는 같은 클래스의 다른 객체를 인자로 받아서 새로운 객체를 생성하는 특별한 형태의 생성자이다.

 

복사 생성자는 객체의 멤버 변수 값을 복사하여 새로운 객체를 초기화하는 역할을 한다

#include <iostream>

class MyClass {
public:
	// 생성자
	MyClass(int n) {
		num = n;
	}
	// 복사 생성자
	MyClass(const MyClass& other) {
	// 멤버 변수의 값을 복사하여 새로운 객체를 초기화
		num = other.num;
	}
    
	int getNum(void) {
		return num;
	}
private:
	int num;
};

int main(void)
{
	MyClass a(5);
	MyClass b(a);
    
	std::cout << a.getNum() << std::endl;
	std::cout << b.getNum() << std::endl;
}

 

int 형 변수 num에 5로 설정하는 객체 a를 복사하여 b에 복사하고 싶을때 b(a) 와 같이 사용한다.

출력 결과는 둘다 동일하다.

+ Recent posts