월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[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 어셈블리어 해석에서 자꾸 헷갈려서....
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
패딩 관련...
루키스님 안녕하세요 1. 다름이 아니라, 패딩 관련 설명을 듣고 이것저것 실험하던 중, struct ObjectInfo2 { short type; char defence; int hp; __int64 attack; }; 로 ObjectInfo2라는 새로운 구조체 타입을 만들고 ObjectInfo2 playerInfo2;를 한 뒤 디버깅 상태에서 sizeof(playerInfo2)를 조사식에 입력하였는데 예상대로라면 __int64의 크기 * 4 = 32byte가 나올 줄 알았는데 오히려 12byte라고 출력되었습니다... 왜 이런 결과가 나온 것인가요? 2. 32bit 체제와 64bit 체제는 메모리나 레지스터 체계에서 4바이트냐 8바이트냐 정도의 차이가 있다고 들었는데 실제 코딩할 때는 어떤 방식으로 영향을 주고, 또 실수가 난다면 어떤 식으로 나게 되나요? 3. &playerInfo를 하니 주소값이 나왔는데 멤버 변수들의 값이 해당 주소값보다 높은 주소들에 위치하고 있었습니다...전역변수들은 원래 이렇게 되는 것인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
화면이 까맣게 나오고 소리만 나옵니다.
실행 환경 mac m1 크롬입니다. 어떤 문제일까요?
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 및 기타 궁금증
루키스님 안녕하세요 다름이 아니라, 포인터를 공부하다가 헷갈리는 부분들이 있습니다... __int64* ptr2 = &number;에서 number의 값이 int type인데 그 주소는 __int64 type으로 받아들이고 있어서 오류가 난다고 하셨는데 &number랑 number의 타입이 다른 게 왜 오류의 원인인지 모르겠습니다...;; 그리고 __int64 type으로 가정하고 받아들이고 있는 것은 &number 내에 있는 number의 값 아닌가요? p.s. 요즘 알고리즘 문제들을 기초적인 것들부터 풀고 있는데 cin과 cout을 사용할 때 std::ios_base::sync_with_stdio(false); cin.tie(NULL); 추가 + endl을 ‘\n’으로 변경해야 통과가 되는 문제들이 있었습니다..(1개만 해도 되는 문제들도 있었지만) 그래서 해당 내용들을 한 번 인터넷으로 검색해봤는데 std::ios_base::sync_with_stdio(false); cin.tie(NULL); 이 코드들의 경우 아직 지식이 부족해서 그런지 대략적으로 ‘알고리즘 풀이용으로는 사용가능하지만 실제 업무에서 사용하려면 부작용이 큰 방법’ 정도로만 이해를 했습니다. 실제 업무에서 사용하는데 부작용이 크다면 사용을 안 하는 게 맞는 것 같은데 사용을 안 한다면 printf, scanf에 비해서 cin, cout의 실행시간이 느려져버린다고 하니, 그렇게 된다면 실제 업무에서는 cin,cout 대신 printf, scanf 등만 사용이 되는 것인가요? 그리고 endl과 ‘\n’도 비슷한 경우인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
int main 안에 변수 선언시에도 .data, .bss 분류해주나요?
컴파일러가 알아서 .data와 .bss로 전달해준다고 영상에서 설명을 들었는데, 7분 35초 즈음에 int main() 함수 밖에 변수를 선언하면 초기화에 상태에 따라 .data 혹은 .bss 영역으로 간다고 설명해 주셔서 int main()은 그럼 다른게 있는가 하는 궁금증이 생겨서요.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
cmp 비교시 데이터값 질문드려요
cmp dst, src 도 마찬가지로 dst에는 레지스터 or 메모리 src에는 레지스터 or 메모리 or 상수 이렇게 사용가능하고 상수와 상수, 메모리와 메모리를 동시에 사용못하는 것이지요? GET_DEC 1, num1 GET_DEC 1, num2 cmp [num1], [num2] 하면 에러가 발생하고 cmp 10, 20 하면 에러가 발생하고 GET_DEC 1, num1 GET_DEC 1, al cmp al, [num1] 하니 정상 작동하더라고요
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
혹시 함수의 매개변수 타입을 명시적으로 나타내도록 할 수는 없나요?
강의 내용에는 나오지 않는 부분인 것 같아 먼저 죄송하단 말씀 드립니다! 마땅히 물어볼 곳이 없네요... 질문 드리고자 하는 것은 explicit 키워드와 관련된 것인데요. explicit 키워드를 사용하면 '생성자'의 매개변수 타입을 명시적으로 나타내야만 컴파일러가 통과시켜 준다는 것을 알게 되었는데요. 그렇다면 함수도 explicit 키워드를 사용하면 똑같은 일을 할 수 있지 않을까? 했는데 컴파일러가 안받아주더군여... 혹시 함수도 이런 명시적으로 선언하도록 강요할 수 있는 키워드나 어떤 방법이 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
마지막 문제 질문
arrows[i] -> AttackTarget(); 이 실행되기 전에 knight의 메모리가 소멸되면 저런식으로 if (knight == nullptr) break; 와 같이 if문을 사용해서 for문을 탈출하게하는 방법도 괜찮은가요? 다른 문제가 생길까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
sasm 오류
첫 sasm강의에서 setting을 확인하라고 하면서 hello world가 출력이 안되는데 왜 그런건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
오른값 참조 활용방식
수업을 들으면서 오른값 참조를 어떻게 활용할 수 있는 생각해봤는데 그럼 파티원들이 단체로 던전에 입장을했고 그 던전에서만 사용되는 특정 장치나 아이템이 있는경우 던전 함수에서 임시 객체로 장치를 생성하고 플레이어들이 하나만 존재하는 그 장치의 소유권을 주고 받으면서 이용하는 구현을 할때 활용 할 수 있는건가용??? 함수 인자로 임시객체를 생성하니 알아서 스택에 생성되고( 던전 함수 내부에서 생성할 필요 없음)+ 후에 신경써서 정리해주지 않아도되는 편리함에 사용하는건가요???