전체 글

C++ TIPS

#define을 활용하여 만드는 편리한 매크로들

* 동적할당한 변수를 지워주는 매크로 함수 #define SAFE_DELETE(p) if(p) {delete p; p = nullptr;} * 동적할당한 배열을 지워주는 매크로 함수 #define SAFE_DELETE_ARRAY(p) if(p) { delete[] p; p = nullptr;} * #define을 사용할 때 \를 사용하면 바로 아래줄의 코드를 올려서 붙여주어 한줄로 인식시켜 준다. *** 가장 마지막줄은 \을 빼 주어야 한다. * 이를 이용하여, 싱글턴 패턴 클래스를 편리하게 만들어 주는 define 매크로를 만들 수 있다. *싱글턴 패턴 선언 매크로 #defineDECLARE_SINGLE(Type)\ private:\ static Type*m_Inst;\ public:\ static T..

연습 노트

파일입출력 연습

#include struct Stats { int Str; int Dex; int Int; int Luk; }; int main() { FILE* File = nullptr; fopen_s(&File, "StatSave.txt", "wb"); if (File) { int Tempnum = 5; fwrite(&Tempnum, sizeof(int), 1, File); int* TempArr = new int[32]; for (int i = 0; i < 32; ++i) { TempArr[i] = i + 1; } fwrite(TempArr, sizeof(int), 32, File); char* NameArr = new char[32]; strcpy_s(NameArr,32, "안녕하세요"); fwrite(Name..

C++기초

220329(2)_이진 파일 입출력(2)_읽기

#include enum class EItemType { Weapon, Armor }; struct ItemInfo { char Name[32]; EItemType Type; int Option; int Price; int Sell; }; int main() { FILE* File = nullptr; fopen_s(&File, "Test.txt", "rb"); if (File) { //3번인자: 기준점을 정한다. //SEEK_END: 파일의 가장 끝 //SEEK_SET: 파일의 시작점 //SEEK_CUR: 현재 파일커서 // //2번인자는 Offset으로, 3번인자에 지정된 지점으로부터 //몇 바이트만큼 떨어진 곳을 커서의 위치로 지정할지를 정한다. //아래는 파일 커서를 가장 끝으로 보낸다. fseek..

C++기초

220329(1)_이진 파일 입출력(1)_쓰기

#include enum class EItemType { Weapon, Armor }; struct ItemInfo { char Name[32]; EItemType Type; int Option; int Price; int Sell; }; int main() { FILE* File = nullptr; fopen_s(&File, "Test.txt", "rb"); if (File) { //3번인자: 기준점을 정한다. //SEEK_END: 파일의 가장 끝 //SEEK_SET: 파일의 시작점 //SEEK_CUR: 현재 파일커서 // //2번인자는 Offset으로, 3번인자에 지정된 지점으로부터 //몇 바이트만큼 떨어진 곳을 커서의 위치로 지정할지를 정한다. //아래는 파일 커서를 가장 끝으로 보낸다. fseek..

C++기초

220328(2)_파일 입출력(2)_파일 읽기

#include int main() { FILE* File = nullptr; fopen_s(&File, "Text.txt", ""); if (File) { char Line[256] = {}; //문자열을 읽어온다. 한줄을 읽어오는 기능인데 //개행문자까지 읽어오게 되는 것이다. fgets(Line, 256, File); std::cout

C++기초

220328(1)_파일 입출력(1)_ 파일 쓰기

#include //fopen_s() //이중 포인터를 인자로 받는다. /* * 이중 포인터를 인자로 받는 이유 결과를 반환타입을 정해서 return 을 이용하여 반환하는 형태를 Call By Value라고 한다. 포인터를 이용해서 결과를 반환하는 형태를 Call By Address라고 한다. 레퍼런스를 이용해서 결과를 반환하는 형태를 Call By Reference 라고 한다. 크게 이 세 가지 형태로 함수가 구성된다고 볼 수 있는데 */ //이중 포인터는 Call By Address 형태이다. void Alloc(int** Memory) { *Memory = new int; } int main() { //파일 입출력은 c언어 스타일과 c++ 스타일이 있다. //선생님은 c언어 스타일을 선호 //둘 중..

C++기초

220325(4)_memset, memcpy

#include int main() { //memset : 메모리를 내가 원하는 크기만큼 원하는 값으로 //채워주고자 할 때 사용한다. //**단, 1바이트 단위로 값을 채워준다.** int NumberArray[10] = { 1,2,3,4,5 }; //1번인자 : 메모리 주소 //2번인자 : 채워줄 값 //3번인자 : 채워줄 메모리 크기 memset(NumberArray, 1, sizeof(int) * 10); //NumberArray 배열을 4*10(40byte)만큼 1로 채워라. //이상한 값이 출력된다 //왜냐하면 int는 4byte 단위로 숫자를 읽는데, //memset은 1바이트 단위로 1을 넣기 때문이다. //선생님은 일반적으로 배열을 0으로 초기화하는데 쓴다고 함 //memcpy : 메모리..

C++기초

220325(3)_문자열(String)

#include int main() { //문자열 = 문자의 배열 //이걸 활용해서 메모리 복사라는 매우 유용한 기능을 쓸 수 있다. //char: 1바이트를 차지하는 문자 //wchar_t: 2바이트를 차지하는 문자(유니코드) //한글은 1글자당 2바이트를 차지하므로 char에 저장할때는 //2개의 공간이 필요하다. //문자열의 끝은 0(널문자) 로 표현이 되어야 한다. //지금 당장은 char에 집중할 것임(많이 쓸 것이므로) charText[64] = {}; //문자열도 마찬가지로 0으로 먼저 초기화를 해놓고 사용하는 것이 좋다. charText1[64] = "문자열입니다."; //이 문장을 저장하기 위해선 한글(2) * 6 + .(1) * 1 + 널문자(문장의 끝, 1) 해서 //13바이트가 필요..

C++기초

220325(2)_Define

#include //#define은 전처리기이다. //#define 이름 코드 //코드에서 원하는 부분에 #define의 이름을 넣어주면 //이름 뒤에 있는 코드를 *컴파일 전*에 그곳에 붙여넣어주고 //해당 코드로 컴파일을 진행해 준다. //대신 #define은 한줄로 작성해야 된다. #define COUNT30 //이걸 보고 상수라고 생각할 수 있지만, //정확히는 상수가 아니다. #define OUTPUTTEXT std::cout

C++기초

220325(1)_함수(4)_함수의 재귀(Recursion)

#include /* 재귀함수 : 함수 안에서 자기 자신을 호출하는 함수를 말한다. 재귀함수를 사용할때는 반드시 종료부분을 만들어 주어야 한다. 재귀함수를 종료한다는 것은 더이상 자기자신을 호출하는 것을 막아누즌 것이다. ex)자기 자신을 3번 호출하는 재귀함수 Output시작스택생성 Output시작스택생성 Output시작스택생성 Output끝스택정리 Output끝스택정리 Output끝스택정리 이게 무한으로 반복되면 Output이 끝나서 스택이 정리가 되지 않는다. 그럼 메모리 안의 스택 공간에 계속 생성된 함수의 스택만 쌓이므로 결국 꽉 차게 되고, 오류가 발생하게 된다. 이것을 스택 오버플로우라고 한다. */ /* ↓ void Output() { Output(); } */ //cf)모든 반복문은 재귀..

C++기초

221324(3)_함수(3)_함수 포인터

#include //함수 포인터 확인을 위한 함수들 선언 void Test() { int Number = 100; std::cout

C++기초

220324(2)_데이터 타입, 지역 변수와 정적 변수

#include int g_Number = 100; //전역 변수 테스트 int Add(int Number1, int Number2) { return Number1 + Number2 + g_Number; } int Add(int Num1, int Num2, int Num3) { return Num1 + Num2 + Num3 + g_Number; } int Add1(int Number1, int Number2 = 20) { return Number1 + Number2; } float Add(float Number1, float Number2) { return Number1 + Number2; } /* //C++의 메모리 영역: 스택, 데이터, 힙, 코드의 4가지. * 스택 영역: 함수의 인자 혹은 함수의 ..

hyrule
C++ 프로그래밍 공부