월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
스택프레임 예제에서 주소 관련 질문
안녕하세요 루키스강사님 스택프레임은 함수호출이 끝나면 사라지니까 TestPointer 함수에서 a에 대한 주소값을 참조로 넘겨주면 나중에 다른 함수(TestWrong)가 호출됐을 때 영역이 겹쳐 이상한 메모리를 건들 수 있으므로 절대로 넘겨줘서는 안된다는 걸 잘 알겠습니다. int* TestPointer() { int a=1; return &a; } void TestWrong(int* ptr) { int a[100] = { }; a[99] = 0xAAAAAAAA; *ptr = 0x12341234; } 그런데 이 예제에서 *ptr을 매개변수로 받았는데 ptr이 왜 a[100]을 가리키고 있었는지 궁금합니다. 주소를 디버깅해보니 이런식으로 나오더라고요 a 주소 : 0x0113F484 a[99] 주소 : 0x0113F610 ptr 주소 : 0x0113F614 a와 a[99]의 주소는 납득이 가는데 ptr의 주소는 왜 a[99]에서 한칸 더 가있는게 되는 건가요? 우연이라기엔 다 비슷하게 나오는거 같아서 뭔가 규칙이 있나 싶어 여쭤봅니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
operator질문드립니다
class NullPtr { public: template<typename T> // #1 operator T* () const { return 0; } // #2 template<typename C, typename T> operator T C::* () const { return 0; } private: // #3 void operator&() const; }; nullptr보다 operator로 구현하는 부분이 궁금해서 질문 드립니다. 1) 코드에서 #1과 #2에 operator선언시 operator앞에 return 타입을 따로 지정하지 않았는데도 오류가 발생하지 않는 데 operator의 return값은 항상 명시하지 않아도 되나요? 2) #2에서 선언한 operator가 이해가 잘 안되는데 C라는 클래스의 멤버함수 포인터를 T라는 타입으로 받아준다(?)라고 하셨는데 그럼 이건 operator를 선언할때 선언부의 해석을 어떤순서로 해야 하는건가요? C::*타입을 T로 typedef한것과 같은 의미로 봐야 하는걸까요? operator를 해석할때마다 정확한 기준이 잡혀있지 않아 항상 혼돈이 옵니다 ㅠㅠ 3) #3에서는 operator의 리턴 타입이 void로 명시되어 있습니다. #1과 #2와는 다르게 operator앖에 리턴 타입이 명시된 경우는 어떤 경우인가요? void를 빼면 build error가 발생하는데 #1과 #2와 어떤 차이가 있는지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
유니코드 질문입니다.
c언어로 여러가지 실험을 좀 하고있는데 char a = 'a' printf("%c", a);하면 a라는 글자가 잘 나오고 char a = '가'; 로 바꾸고 출력하면 '?'라는 글자가 뜨더라구요? _wsetlocale(LC_ALL,L"korean"); <- 이게맞나 잘 모르겠네요 wchar_t *a = L"가"; wprintf(a); 로해야 '가'라는게 잘뜨는걸 확인했습니다 근데 char a[] = "가나다라마"; printf("%s", a); 이렇게하면 가나다라마가 잘 나와요 여기서 드는의문이 둘다 똑같이 문자저장인데 왜 문자열로하면 유니코드? 이걸 따로 설정을 안해줘도 한글이 잘 나올까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
아래분과 비슷한 질문인데 답변을 듣고도 이해가 가지 않는 부분이 있어 질문 드립니다.
// 스택 프레임 [ 지역변수 ] a가 함수가 종료되면서 없어지는데 함수 반환을 지역변수 a의 주소값으로 하고 있다. int* TestPtr() { int a = 3; return &a; } // TestWrong() 함수가 호출되면서 다시 한번 스택프레임이 쌓이는데 이때 그전에 사용되고 반납됐던, TestPtr() 스택프레임 부분이 재사용되게 되고, // a[0] ~ a[99] 까지 100개의 int(4byte)가 스택프레임 [지역변수] 에 쌓이고 [매개변수]로 받은 ptr이 가리키는 값을 다시한번 0x12341234로 수정한다. void TestWrong(int* ptr) { int a[100] = {}; a[99] = 0xAAAAAAAA; *ptr = 0x12341234; } int main() { // TestPtr() 스택프레임의 지역변수 a의 주소를 리턴받고 int* ptr = TestPtr(); // TestPtr 호출이 종료되면서 스택프레임에 있는 a의 주소 값이 유효하지 않게 되는데, 엄밀히 말하면 메모리 입장에서는 사라지는게 아니고 스택프레임 관리 차원에서 esp를 땡겨주는것이기 때문에 // ptr에 담긴 값을 수정할 수 있다. ( 이 자체만으로도 치명적인 문제! 하지만 디버깅에 문제없이 작동된다. ) *ptr = 123; TestWrong(ptr); return 0; } 제가 이해가 안가는 부분은 *ptr = 0x12341234; 가 디버깅 단계에서 오류가 나는 부분입니다. TestPtr() 이 사용했던 스택프레임을 재사용하다 운이 나빠 ptr의 주소가 TestWrong() 스택프레임의 지역변수 a배열 마지막 a[99] 다음인 ( a[99] + 1 ) 에 있다고 하더라도 그 ptr을 수정하는게 TestWrong() 스택프레임과 관련이 없는거 아닌가요? 마치 main 함수 내에서 유효하지 않더라도 *ptr = 123; 을 수정했던것처럼요.제가 놓치고 있는 부분이 있을까요?계속 고민해도 갈피가 잡히질 않네요..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 실습에서 임시변수에 값을 넣어주는 타이밍
14:40초부터 임시변수에 값을 넣어주는 부분이 영상에서는 차례대로 값을 넣어주는데 제가 해보니까 함수가 끝날때 rbp를 pop해줌과 동시에 임시변수에 값이 한번에 들어가는데 이건 혹시 컴파일러의 차이인가요? <pop전> <pop후>
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
배운 내용과 실제 스택 작동방식이 다릅니다.
이전 강의에서는 함수가 스택 영역을 사용할 때 bp와 sp가 같은 위치인 상태에서 sp를 일정한 값으로 빼주고 빼준 값 만큼 스택 영역을 확보한 뒤 bp와 sp 사이의 공간을 메모장처럼 사용한다고 하셨습니다. 하지만 제가 직접 확인 해보니 sub esp, 0c0h로 sp를 빼는 것 까지는 맞으나, ebp와 esp 사이의 영역은 안 쓰고 0c0 만큼 빼진 새로운 esp 지점 부터 사용됩니다. 배운 거랑 달라서 혼란스럽네요 환경은 x86이고 vs2017 사용하고 있습니다 요약하자면 아래 그림과 같이 스택이 사용됩니다. 왜 이러는 건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
.h와 .cpp는 어떤 원리로 연결되나요?
안녕하세요, 궁금한 점이 생겨 질문드립니다. a.h와 a.cpp, main.cpp가 있을 때 main.cpp에 #include a.h를 해줬고 컴파일 이후 링킹 과정에서 a.cpp를 링크시킨다고 하던데 이때 과정이 궁금합니다. a.h와 a.cpp의 이름 a를 통해 연결되는 건가요, 아니면 a.cpp안의 #include a.h를 보고 연결시키는 건가요? 감사합니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
생성자
지금껏 생성자는 1번 호출이라고 생각했는데생성자가 여러번 호출 될 수 있나요?? 그렇다면 k5 = 1은 k5의 생성자가 2번 호출되어서 k5가 새로운 메모리 주소에 할당이 되는건가요 아니면 새로운 Knight가 타입 변환 생성자로 메모리 공간에 잡히고 k5에 값이 복사가 되는 것인가요...?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Exercise_A 질문입니다.
위 사진의 46번째 줄 delete[] arrows; 처럼 Arrow* 배열을 해제시켜주는 것은 불가능한가요? 생각나는 안되는 이유로는 1. 기본 타입이 아니어서 안된다. 2. Arrow 클래스 소멸자 부분을 수정해줘야 한다. 이정도네요. 정확한 이유가 뭔가요?!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
메모리 저장
루키스님 좋은강의 잘 듣고있습니다! 다름이 아니라 강의를 듣다가 메모리에 데이터가 저장된 부분을 보니 데이터가 연속적으로 저장되지않고 16바이트 정도 띄워져서 저장이 된걸보고 구글링을하다 64비트 환경이여서 메모리 정렬때문에 8바이트 단위로 저장이 된거구나 라고 생각했는데 이 이유가 맞나요?? 또,막상 이렇게 확인해보니 cccccccc 0113f8a0 0000001 ccccccccc 이런식으로 저장된걸 보니 왜 cccccccc 0113f8a0 ccccccccc 0000001 이 아니지라는 의문이 생기더라구요 이유를 알고싶으면 운영체제를 공부해야하나요? 아니면 컴퓨터 구조쪽을 공부해야하나요??? 무엇을 공부해야 알 수 있을지 궁금해요 ㅜㅜ
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
중간 삽입/삭제 질문
1) 중간 삽입/삭제가 빠르다 라고 하셨는데 단 해당 위치를 알고 있다는 가정하에 빠르다 라고 하면 올바른 설명이 되나요? 2) erase의 경우 iterator로 위치를 알고 있어야 하는데 remove의 경우 data값만 지정해주면 해당 값이 삭제된다고 설명해주셨습니다. remove의 경우 삭제하고자 하는 값의 위치 정보를 모르는데 삭제가 가능하다는 것은 결국 list를 전부 돌면서 해당 data값을 찾기 때문에 느리다 라고 이해하면 될까요? 3) remove는 느리더라도 원하는 값을 삭제할 수 있다는 장점이 있는데 erase는 iterator로 해당 위치를 알고 있어야 합니다. 그렇다면 추후에 성능을 고려해서 코드를 작성할 경우 erase를 사용 할 계획이라면 다루고자 하는 데이터의 모든 위치를 iterator로 기억하도록 해야 하는건가요? 현업에서 list를 사용한다면 erase를 어떻게 사용하는지 간단한 예시를 알려주시면 좋을 것 같습니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
매개변수를 넘겨받는다는 것이...
정확히 어떤 의미인가요? 매개변수와 인수에 대해서 검색하니 매개변수(인자) - 함수 원형 작성 시 사용되는 변수 인수 (전달인자) - 함수를 실행할 때 매개변수로 넘겨주는 값으로 나왔는데 이 정의대로라면 '매개변수가 인수를 넘겨받는다'는 이해가 되도 '매개변수를 넘겨받는다'라는 말은 무슨 뜻인지 이해가 잘 되지 않습니다...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
pp 질문입니다.
이틀동안 고민했어요. 이렇게 생각하면 맞는건지 궁금해요.. pp 포인터 변수는 main 스택프레임 안의 메모리에 박혀있고. ex) const char** pp -> 0x00000001주소에 박혀있음 pp포인터 변수는 &msg의 주소를 가짐 pp 변수의 주소를 SetMessage 의 매개변수 a에 넣음. *a 로 a(pp)변수가 가진 주소로 텔레포트 -> &msg &msg가 가진 주소에 "bye"의 주소를 넣음 const char** pp = &msg; //[매개변수][RET][지역변수 (msg(hello의 주소)) ][매개변수(a((msg의 주소)))][RET][지역변수] // 매개변수 a 는 pp(&msg)의 주소를 가짐. //*p로 pp 가 가지고있는 &msg주소의 값을 가져옴 // 어라? 주소가 또 있네? -> 그 주소를 바꾸는 것. (&msg가 가지고있는 값(주소)를 바꿈) // 그래서 바뀌는 것. SetMessage(pp); cout << msg << endl;
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
여러개의 로또번호 추출 질문
선생님 로또번호 생성기를 다 작성 후 로또를 사게되면 통상 5천원 정도 자동으로 돌리는데 ChooseLotto()함수를 여러번 돌리면 될줄 알았지만 전부 다 같은 값으로 Print 되는것을 보았습니다. for문으로 반복해서 그런줄 알았더니 그냥 호출을 여러번 해도 결과가 똑같더군요 변수명도 바꿔보고 초기화도 해봤지만 결과는 같은값 5줄이 Sorting 되어서 나옵니다. 각 줄마다 다른 숫자로 자동 5천원 돌렸을 때처럼 나오는건 어떻게 할 수 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
반복문 최적화 관련 질문 있습니다!
2.compute bound - loop inversion, Optimization of Computer Programs in C 이 부분을 읽고서 무슨 뜻인지 알기 어려웠는데 수업을 레지스터를 하나 더 적게 사용할 수 있겠다는 생각이 들었습니다. RayTracing In One Weekend 9.5 A Scene with Metal Spheres 를 살펴보면 이미지 픽셀을 순회할 때 전위 감소 연산자를 사용하고 있는데 최적화 기법을 고려하여 배열은 순회하도록 작성됐다고 생각해도 괜찮을까요? ... std::cout << "P3\n" << image_width << " " << image_height << "\n255\n"; for (int j = image_height-1; j >= 0; --j) { std::cerr << "\rScanlines remaining: " << j << ' ' << std::flush; for (int i = 0; i < image_width; ++i) { color pixel_color(0, 0, 0); for (int s = 0; s < samples_per_pixel; ++s) { auto u = (i + random_double()) / (image_width-1); auto v = (j + random_double()) / (image_height-1); ray r = cam.get_ray(u, v); pixel_color += ray_color(r, world, max_depth); } write_color(std::cout, pixel_color, samples_per_pixel); } } ... 외부 루프는 --j인데 내부 루프는 ++i인 이유에 대해서도 조금 궁금합니다. 리틀엔디안 빅엔디안이랑 관련이 있을까요? 현업에서 그래픽스 라이브러리 API를 가져다 쓰거나, 만들어 쓸 때 인덱스를 --i를 선호하는지 ++i를 선호하는지 궁금합니다!
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
computerValue 만들 때..
안녕하세요 좋은 강의 잘 듣고 있습니다 다름이 아니오라, computerValue 값을 만들 때 0~32767까지가 총 32768개의 숫자라서 0,1,2가 나올 확률이 실제로는 10922/32768, 10923/32768, 10923/32768로 미세한 차이가 날 것 같은데 이 미세한 차이까지도 맞춰주는 방법이 있을지가 궁금합니다! 그리고 1번째 예제를 직접 만들었을 때 처음에는 while(true) 안에 switch를 쓰고 그 안에 if-else if-else를 쓰는 방식으로 만들었습니다. 그런데 직접 실행시켰더니 마지막 default 쪽에서 break를 걸어놓아도 switch까지만 break를 하고 while 내에서 계속 작동이 되었고 결국 해결을 못했습니다...이 경우는 어떻게 해결할 수 있을까요? 마지막으로 input과 computerValue를 while 내에 넣어주셨는데 computerValue를 그렇게 하신 이유는 이해가 되었지만(매번 value값 갱신을 해야해서) input의 경우는 잘 모르겠습니다...그냥 main 내에만 넣는 것과 유의미한 차이가 있는 것인가요? 감사합니다!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
선생님 화면이랑 호출스택이 다르게 나옵니다ㅠㅠ
Exercise 8번 문제를 실행하면 선생님 호출스택에서는 [ Exercise_8.exe!Archer::~Archer() 줄 17 ] [Exercise_8.exe!main() 줄 57 ] 이렇게 뜨는데, 제 호출스택은 위와 같이 나옵니다. 클릭해보면 제가 만들지도 않은 이상한 코드들이 나오는데 통상 디버깅할때 저런 코드들은 무시하면 되는건가요? 그리고 호출 스택이 다르게 나오는 건 그냥 컴퓨터 환경마다 달라서 그런건가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
디버깅시
안녕하세요 시간 21:25 디버깅시 저는 자동칸에 들어가도 이름이 total , winPErcentage, wins가 자동으로 안뜨더라구요. 세팅을 어떻게 해주어야 자동으로 변수들이 입력된 것을 볼 수 있는지 알 수 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
Game 객체는 왜 stack 영역에 만들었나요?
Game도 어찌됐든 객체인데 스택에 만들어주는 이유가 있나요? Game 객체의 크기가 커지는 경우 stack overflow가 발생하진 않나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
포인터 멤버 변수
class Game { public: private: Player _player; Player* _player; }; 클래스 멤버 변수로 포인터가 아닌 일반 객체를 선언해서 들고 있을 경우 발생하는 문제점(?) 혹은 한계에 대해 질문이 있습니다. 첫째, 일반 객체에 추후 knight, archer 등등 다른 캐릭터 타입을 _player에 할당할 경우 자식 클래스의 데이터가 더 크기 때문에 데이터 소실이 발생할거라고 설명을 해주셨습니다.그런데 이 문제는 포인터로 선언해서 들고 있는 클래스 변수에도 동일하게 나타나는 문제가 아닌가요? 강의를 듣고 이해하기로는 포인터가 아닌 일반 클래스 타입 객체를 사용할때만 이 문제가 발생하는 것으로 이해가 되는데 제가 잘못 이해한 부분이 있을까요? 둘째, 포인터 변수와 일반 클래스 변수와의 명백한 차이는 Game 클래스 자체적으로 들고 있어야 하는 데이터 양이 크기인데 포인터의 경우(4 or 8 byte)로 국한되지만 일반 클래스 변수의 경우 해당 멤버 클래스의 크기만큼 Game 클래스에서 복사되어 들고 있어야 한다. 멤버 변수로 포인터가 아닌 일반 클래스 변수를 들고 있을 경우 발생하는 한계점에 대해 '두번째'로 언급한 내용에 대해서는 이해가 됩니다. 하지만 첫번째 내용이 명확히 이해가 되지 않습니다.