월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
람다식과 함수포인터 관련 질문입니다.
위와같이 람다함수를 함수포인터에 대입하는건 에러가 안나는데 람다 캡처 블록에 값표시(=),참조표시(&)를하면 에러가 생기는데 이유를 모르겠습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
원인이 뭔지 잘 모르겠습니다 ㅠㅠ
안녕하세요 열공하고있는 초보 학생입니다! 강사님의 강의를 여러번 돌려보면서 복습차 텍스트 RPG를 만드는 중에 이해를 못하는 부분이 생겨서 질문드립니다.. 이것때문에 어제 오늘 뇌가 폭발할 지경이네요! struct Playerinfo{ int Hp; int Atk; int Def;}; void EnterLobby();void Stat(Playerinfo& info);void UserInfo(Playerinfo& ttt); int main(){ Playerinfo player; EnterLobby(); UserInfo(player);} void EnterLobby(){ cout << "(1) 테스트입니다." << endl; cout << endl; int userinput; cin >> userinput; Playerinfo player; if (userinput == 1) { Stat(player); cout << player.Hp << " " << player.Atk << " " << player.Def << endl; }} void Stat(Playerinfo& info){ info.Hp = 100; info.Atk = 100; info.Def = 100;} void UserInfo(Playerinfo& player){ cout << player.Hp << " " << player.Atk << " " << player.Def << endl;} 원래는 각종 기능을 넣어서 만들다가 중간에 막히는 부분이 생겨서 다 지우고 테스트 삼아서 위에처럼 작성해봤는데 여전히 똑같은 문제가 발생하고 있습니다. 이렇게 작성 후 실행을 하고 1을 누르면 처음에 참조로 수정했던 Hp, ATK, DEF 가 UserInfo 함수로 넘어와서 다시 참조로 출력해보면 괴랄한 숫자로 바뀌어버리는데 이게 도대체 무슨 이유일까요.. 지금 C++ 공부시작한지 한달도 안되어서 겨우겨우 포인터랑 참조를 몇번씩 돌려가며 열공중인데 복습차원에서 만들다가 이부분이 막혀서 원인을 모르겠습니다 ㅜㅜ 제발 도와주세요~!!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
몇가지 질문이 있어서 글 올립니다 !
강사님 안녕하세요! 강의를 들으면서 몇가지 궁금증이 생겨서 질문을 올리게 되었습니다. 1. 어셈블리어 학습 정도. : 어셈블리어는 처음이라 강의 내용의 흐름은 이해가 가지만 sasm에서 사용하는 문법이라던지, 레지스터 용어, 16진수와 2진수의 매끄러운 변환등 디테일한 부분들을 완벽하게 짚고 넘어가지 못하는 생각이 들었습니다. C++을 주언어로 사용하는 게임개발자 취업을 준비하는 입장에서는 어셈블리어의 학습을 어느정도까지 해두어야 할지 궁금해서 여쭤봅니다. 중요한 부분이라면 강의를 여러번 반복하거나 관련 서적을 이용하여 깊게 공부해두려고 합니다. 2. 게임개발자의 고용 형태. :강사님의 게임 프로그래머 개론을 들으면서 갖게된 궁금증이 생겼습니다. 보통 프로젝트 단위로 게임 개발자의 채용이 이루어진다고 하셨는데 , 그렇다면 게임 개발자는 정규직이 아닌 계약직 형태로 채용이 더 많은건지 궁금증이 생겼습니다. 물론 정규직 채용과 계약직 채용이 둘 다 있을거라고 생각하는데, 프로젝트 단위의 계약직 채용이 주를 이루고 있는걸까요 ? 3. part2 :아직 part2를 듣지 못했기 때문에 조금 이른 질문일 수도 있지만 part1이 끝나면 part2와 part3를 같이 들을 예정입니다. part2의 DirectX12 강의는 클라이언트 개발자의 주된 기술과 관련된 부분이라고 볼 수 있을까요 ? 아직 part4까지 듣지 못해서 단정지을 수 는 없지만, 클라이언트 개발자 쪽이 조금더 흥미가 가는 것 같아서 질문드립니다. 좋은 강의 올려주셔서 항상 감사합니다. 열심히 배우겠습니다.
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
rbp 스택에 저장할시 메모리 변조
해당 함수에서 여러가지 포인터 연산중 실수로 rbp저장된 곳을 건드리게 된다면 나중에 함수 반환시 크래쉬가 날 것 같긴합니다만 애매하게 rbp가 다른 가상메모리 주소로 가게 되서 프로그램이 동작하게 된다면 너무너무 위험한거 아닌가요? 혹여나 버그 발생한 장소를 찾아낼수 없는 경우도 발생하나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
12분 질문
레지스터의 크기에 따라서 예약된 이름이 다르다고 하셨는데 이상태의 경우인데 강의에서는 mov eax, 0x1234 mov rbx, 0x1234567 mov cl, 0xff 이렇게 해주셨는데 그러면 eax라는 이름에 0x1234가 왜 안들어가고 rax에 값이 들어가나요? rax는 64비트이고 eax는 32비트의 이름을 가진 레지스터인데.. 이해가 잘 가지 않습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Pat1 을 공부하고 여러가지 잡다하게 공부하다 현타가 심하게 온 1인입니다
part5는 언제 나오는지 선생님 답답해 미치겠어요 ㅠㅠ 5출시도 했는데 어디 배울만한곳이 학원도 없어서그러는데 언제쯤 출시하실 계획인지 알수 있을까여?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
end( )의 의미?
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. map<int, int> m; for (int i = 0; i < 1000; i++) { m.insert(pair<int, int>(i, i + 100)); } map<int, int>::iterator findit = m.find(100); if (findit != m.end()) { cout << "찾음" << endl; } else { cout << "못찾음" << endl; } 이터레이터가 주소를 가리키는 걸로 배웠습니다. 그런데 if (findit != m.end()) 이부분이 이해가 되질 않습니다. 심지어 if (findit != m.begin()) 이렇게 수정해 봤는데도 "찾음" 이라고 출력 됩니다. end( ) 함수는 데이터 끝에 다음 쓰레기 값을 들고 있는걸로 기억하는데 if (findit != m.end()) while문을 쓴것도 아니고? for문에 범위 지정을 할때는 end( ) 쓰는건 이해가 됩니다. 어떻게 이게 되는지 전혀 이해가 안 됩니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
VS 대신 VScode를 사용해도 될까요?
지금 군대에서 강의를 듣고있는데 사지방 컴퓨터가 껏다 켜면 초기화 됩니다. 그래서 VS를 매번깔기엔 용량부담이 너무 큰데 vscode나 구름 ide를 활용해도 될까요? 차이가 많이 날까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
wchar_t wch = L '안'; 관련.. 질문
강의를 보면서 따라 작성을 하였는데 L 밑에 빨간줄이 뜹니다. 빨간줄(식별자 L이 정의되어 있지 않습니다) 무엇을 고쳐야 하나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
중첩현상 설명에서..
Test1.h에 #include 등의 내용이 들어간 상태에서 cpp 파일에 Test1.h를 include를 하게 되면 중첩현상 발생 + 해당 cpp 파일의 작업량 증가가 일어난다고 설명해주셨는데 해당 cpp 파일에도 동일한 #include가 들어있다고 가정한 상태에서 이런 현상이 발생하는 것인가요, 만약 맞다면 cpp 파일 내에 #include가 아예 들어있지 않다면 중첩현상이나 작업량 증가는 발생하지 않게 되는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
메모리 오염에 대해서 궁금한 것
int a[100] = {}; a[99] = 0xAAAAAAAA; int b = 0xAA; 로 TestWrong 함수의 내용을 작성하고 디버깅을 해봤는데 스택 함수는 높은 주소 -> 낮은 주소로 이동한다고 알고 있는데 &(a[0])의 값(0x004FF45C)이 &(a[99])의 값(0x004FF5E8)보다 더 낮았습니다. 배열의 원소들이 스택에 들어갈 때는 높은 index의 원소들부터 먼저 들어가게 되는 것인가요? 2. 1번과 연계해서 0x004FF450 000000aa -> &b 0x004FF454 cccccccc 0x004FF458 cccccccc 0x004FF45C 00000000 -> &a[0]에서 &a[0]과 &b 사이에 있는 c들도 오버플로우 감지용이 맞을까요? 3. 유효하지 않다는 의미는 메모리가 더 이상 유효하지 않다는 것은 엄밀히 따지면 아니고 스택 프 레임 관리를 할 때 커서를 쭉 당겨서 main 관련 스택프레임까지만 유효하다고 규칙을 정한 것 이라고 하셨는데 둘의 차이가 정확히 어떻게 되는 것인가요? 고민을 많이 해봤는데도 잘 모르겠습니다...;; 4. TextRPG3 내용이긴 하지만, 메모리 오염 내용에서, 지역변수가 존재하는 함수의 하위함수에서는 해당 지역변수의 주소값을 매개변수로 쓰든 output으로 쓰든 다 괜찮고 해당 함수의 범위 바깥에서만 사용 안하면 된다로 이해하면 될까요? 5. int(*p2)[2] = arr2;에서 p2에 int(*)p2 대신 int(*)[4]나 int(*)[2][2] 형식이 못 들어가는 이유는 컴파일러가 그냥 그렇게 정해주었기 때문인가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
강사님 벡터 capacity 메모리 관점 질문입니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요.벡터의 capacity가 늘어날때마다 기존의 데이터를 재할당시킨다는 것은조사식을 통해 &v[0]의 주소값이 변하는 걸로 확인했습니다. 여기서 질문입니다. 1. 벡터의 capacity 늘릴때 뒷부분에 의미없는 데이터 공간이 있어서 여유 공간이 있으면재할당 안하고 원래 있던 위치에서 더 확장하는 방식도 있나요?(제가 디버깅할땐 해당 메모리주소값이 다 변했습니다) 2. vector<int> v; 선언했을때&v랑 &v[0]랑 주소값이 왜 다른건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
2차원 배열과 2중 포인터 호환
강의를 듣다가 2차원 배열은 2중 포인터와 호환이 안된다고 하셨습니다. 저도 2차원 배열은 결국 1차원 배열이니까 당연히 안되겠지 생각해서 이해했습니다. int arr2[2][2] = { {1,2}, {3,4} };라는 2차원 배열에서int* p3 = (int*)arr2; 라는 포인터 변수를 만들고cout << *p3 << *(p3 + 1) << *(p3 + 2) << *(p3 + 3) << endl; 테스트로 만들어보니 1234가 잘 출력되었습니다. 그런데 강의에서 int(*p2)[2] = arr2;라는 새로운 타입형 변수를 만들어서 (*p2)[0], p2[0][0] 등등 배열처럼 사용하셨는데연습 겸 이걸 포인터식으로 사용해보려고 cout << **p2 << *(*p2 + 1) << *(*p2 + 2) << *(*p2 + 3) << endl; 이런 식으로 테스트 해보니 1234 또 잘 나왔습니다.여기서 **p2는 2중 포인터인데 왜 워프를 두번타는지 이해가 안되었습니다. 그래서 여러가지 테스트를 해보았습니다. cout << **(p2 + 0) << *(*(p2 + 0) + 1) << **(p2 + 1) << *(*(p2 + 1) + 1) << endl; 이것도 1234가 출력되는데 (p2 + 1)이 왜 8바이트만큼 이동하는지, 다시 말해서 [0][0]에서 [1][0]처럼 이동하는게 이해가 안됩니다. 포인터 연산에서 타입 크기 만큼이동한다고 배웠는데 p2의 타입크기는 int[n][m]에서 (4 * m)바이트 인건가요?그렇다면 *p2의 타입크기는 int 즉, 4바이트 인건가요?그리고 p2는 2중포인터 변수인가요? 물론 앞으로 사용하지 않을 것 같지만 궁금증이 문득..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
변수에 상수값 대입 시 어셈블리어와 c++의 차이점
안녕하세요. 어셈블리어 코드에서는 변수에 상수값을 대입 시 mov [a], byte 0x55 처럼 해당 상수의 크기(자료형)를 명시해주어야하고 C++에서는 char c = 100; 와 같이 상수값의 자료형을 명시해주지 않는데요. 이때 100에 커서를 가져가보면 인텔리센스에서는 (int)100 이라고 나오는데, 그렇다면 C++에서 정수 상수는 어셈블리어에서처럼 상수의 크기를 명시해주는 부분이 생략되고 자동으로 int로 취급되는 것인가요? 그리고 이러한 (int)100을 char 변수에 대입하면 char 타입으로 묵시적(implicit) 형변환(type promotion)이 일어나며 char 변수에 저장되는 건가요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
monster_2에 관해서 질문...
루키스님 안녕하세요 다름이 아니라, 비슷한 질문이 이미 있긴 하지만 StatInfo& monster_2 = *(monsters + 2); 부분에서 monster_2[주소]라고 설정하셨던 것은 참조를 c++ 측면이 아닌 어셈블리 측면에서 설명하신 것이고, monster_2가 참조타입이기 때문에 3번째 StatInfo 변수 자체에 다른 이름을 부여한다고 하셨던 것은 c++ 측면으로 설명하신 것이고 그 이후에 주소값을 이용해서 하신 설명은 다시 어셈블리 측면에서 설명하신 것이신가요? 개인적으로 이해를 잘못한 것인지 많이 헷갈립니다 ㅠㅠㅠ 개인적으로는 * (monster_0 == 시작주소) == StatInfo[100, 10, 1] * (monster_1 == 해당주소 1) == StatInfo[200, 20, 2] monster_2 == StatInfo[300, 30, 3(내용물)]로 이해했는데 해당 주소2가 monster_2와 3번째 StatInfo에 어떻게 적용되는지가 궁금합니다... 맞는 것인가요 ?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수 삭제에 대해서
안녕하세요 선생님 강의 33분쯤 내용에 대한 질문입니다! delete k; 에 따라서 k주소의 데이터가 모두 삭제되면 job() 함수를 실행하였을때, this 포인터의 주소를 거치기 때문에 이미 삭제된 엉뚱한 메모리를 건드리는 것이 위험하다는 부분은 잘 이해를 했습니다.. 그렇다면 이미 선언된 job() 함수를 없애는 방법은 없을까요? 나름 고민해서 k = nullptr 를 해봐도 이미 ResetHpJob()의 주소가 job에 저장돼서 안되는거 같더라구요.. 캡처에 this를 표기함으로 위험성을 잘 인지할 수 있다는 것은 이해했지만, 저러한 상황이 왔을 때, 위험한 함수(job)를 아예 제거하는 방법은 없을지 궁금합니다! 만약 제거가 힘들다면 if(k){job()} 와 같은 방식으로 코드를 설계하는 방법이 좋아보이는데,, 혹시 다른 좋은 방법이 있을지도 궁금합니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
배열 질문입니다.
12분 16초 쯔음에 StatInfo* monsters_0 = monsters; 라고 적으시면서 '첫번째 시작주소'를 포인터로 추출한다고 하셨는데 monsters라는 배열의 첫번째 주소인지 어떻게 알 수 있는건가요? monsters +3 이런 식으로 숫자가 안붙으면 맨 처음으로 이해하면 되는 건가요? 아니면 monster_0이라는 변수로 monsters라는 배열에 첫번째로 넣었으니 첫번째 주소인건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
mov [a] 상수값 관련해서 질문이 있습니다.
19:50을 보면 레지스터에 값을 넣을 때는 mov al, 0x00을 사용하고, 메모리에 값을 넣을때는 mov [a], byte 0x55를 사용하셨는데, 메모리에 값을 넣을때는 값을 뜻하는 []를 사용하고, 레지스터에넣을때는 주소값을 사용하는지 알 수 있을까요? 레지스터와 메모리에 접근하는 방식이 달라서 그런걸까요??
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
우측값을 매개변수로 했을때의 의미
안녕하세요 선생님 일단 우측값을 사용할경우 어떻게 동작되는지 숙지했습니다. 우측값 사용에 대한의미도 값에대한 복사가 아닌 이동이라고하는데... 여기서 궁금한점은 굳이 && 우측값을 사용하는가 입니다. 기능적으로는 이동이라는 개념을 포인터나.. const가 아닌 레퍼런스로도 똑같이 따라할수있을거라고 생각합니다. 그 이유가 무엇인지 알수있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
함수문법과 어셈블리어 관련 궁금증...
안녕하세요 어셈블리어랑 코드를 살피다가 궁금한 점이 들었는데 1. 구조체 player를 만들면서 멤버로서 hp,attack,defence을 int type으로 선언하였는데 다른 monster.[멤버]들이나 ret.[멤버]들에 값을 넣을 때의 어셈블리어는 [ebp-0Ch],[ebp-8]로 4바이트 간격을 띄고 있었지만 player.[멤버]들에 값을 넣을 때의 어셈블리어는 [ebp-10h], [ebp-0Ch]로 2바이트 간격을 띄고 있었습니다..왜 이런 현상이 발생한 것인가요? (조사식에서는 &(player.[멤버])를 하니 정상적으로 4바이트 간격이 나왔지만 디스어셈블리에서만 이럽니다...) 2. StatInfo CreatePlayer();라는 함수를 선언할 때 이 경우 함수의 시그니처는 output(반환)형식은 statinfo 타입이고 input(매개변수)은 없다!인 것으로 알고 있는데 스택 프레임이 [매개변수][ret][지역변수(temp(c,c,c -> 100, 10, 2), player(b,b,b -> 100, 10, 2))] | [매개변수(&temp)][ret][지역변수(ret(100, 10, 2))] 가 된다면 CreatePlayer()함수의 스택에 매개변수 &temp가 들어온다는 의미인데 문법적으로 가능한 것인가요? 3. mov [player], 0xbbbbbbbb는 player 변수 메모리(바구니)에 해당 값을 복사한다 mov [esp-10Ch], 0xbbbbbbbb는 esp-10Ch 주소값 안에 들어있는 메모리에 해당 값을 복사한다 lea eax,[ebp-11Ch] 는 &(ebp-11Ch)가 아닌 주소값 ebp - 11Ch를 eax에 복사한다 정도로 이해해도 괜찮을까요? 원래는 lea eax, [변수]면 변수의 주솟값(&변수) 복사, mov eax, [변수]면 변수의 내부값(변수) 복사 이렇게 이해했었는데 최대한 검색을 해봤는데도 메모리창에 &ret랑 ebp-10Ch가 동일한 값을 가지는 것과 [ret]랑 [ebp-10Ch]가 동일한 의미를 가지려면 어떻게 해석해야 하는지랑 lea 어셈블리어 해석에서 자꾸 헷갈려서....