1. 코드

#include <iostream>
#include "windows.h"

using namespace std;

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE, LPSTR, int nCmdShow)
{

    AllocConsole(); // 새로운 콘솔 창 생성
    FILE* pStreamOut = nullptr;
    freopen_s(&pStreamOut, "CONOUT$", "w", stdout);

    cout << "HELLO" << endl;

    Sleep(1000);

    cout << "Bye" << endl;

    Sleep(1000);

    fclose(pStreamOut);
    FreeConsole();
}

 

AllocConsole() 함수로 새로운 콘솔 창 생성

이후 freopen_s으로 표준 출력을 새로 생긴 pStreamOut이라는 콘솔 스트림으로 리디렉션 해줘야함

2. freopen_s 함수 시그니처

errno_t freopen_s(
    FILE** stream,       // 리디렉션된 스트림의 포인터를 저장할 변수
    const char* filename, // 새로운 출력 대상 (파일 경로 또는 특수 장치 이름)
    const char* mode,     // 파일 열기 모드 ("r", "w", "a" 등)
    FILE* old_stream      // 기존 표준 스트림(stdout, stdin, stderr 등)
);

 

old_stream의 stdout으로 리디렉션될 출력은 std::cout 및 printf 호출에 적용된다.

스트림을 닫기전까지는 호출한 상태 그대로 적용된다는 것을 명심.

'윤성우 열혈 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 라이브러리 추가

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

 

프로그램 입력 인자 설정

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

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

주로 인덱스를 다룰때, 그리고 음수가 들어갈수없는 변수의 경우 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