월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
저도 레지스터를 열어보고 싶습니다.ㅠㅠ
일단 엄청난 뉴비입니다..ㅠㅠ 별것 아닌것 같아보이는데 구글링을 아무리 해봐도 해결이 안되서 질문드립니다. 저도 레지스터와 메모리를 SASM에서 변수를 찾아보고 싶은데 (선생님 강의 초반부 레지스터쪽) SASM에서 show memory, show register 부분이 활성화가 안되어있습니다. SASM에서 한줄 한줄 디버깅을 하는것도 안됩니다. (구글링 해보니 이게 해결되면 show memory , show register가 활성화 될것 같더라구요.) 디버그를 누르면 소스코드 처음부터 끝까지 디버그 하고 끝났다고 표시됩니다. LG 그램 , 윈도우 10 사용자에요. 사진 한장 남깁니다. 강의 진도 나가고 싶은데 따라할 수가 없어서 슬퍼요.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
클래스의 "this"와 관련해 질문이 있습니다.
this 문법과 관련해 어셈블리어를 공부하다가 도저히 이해가 안 되는 부분이 있어 질문드립니다. 수업에 나온 class Knight 를 똑같이 만들고, 아래의 맴버 함수를 디버깅했습니다. void Knight::Move(int x, int y) { _posX = x; _posY = y; } 그러면 아래와 같은 어셈블리어가 나옵니다. ecx 레지스터에 있던 클래스의 포인터를 dword ptr [this] 바구니에 저장(mov) 하고, 이 this 바구니에 있는 값(포인터)을 이용해 맴버 변수의 값을 변경하는 것은 이해했습니다. 그런데 this 바구니의 위치와 그 안에 있는 값을 확인하려고 조사식에서 위치를 검색했는데, 아래와 같은 오류가 출력됩니다. 마치 this 라는 바구니가 없는 것처럼 동작하길래, 최대한 구글링을 해서 비슷한 질문을 한 사이트를 발견했는데 여전히 이해가 안 가는 부분이 생깁니다. https://stackoverflow.com/questions/16585562/where-is-the-this-pointer-stored-in-computer-memory 최대한 영어를 이해한 바로는, this는 변수가 아니라 계산식?(expression), 그러니까 포인터 값 그 자체이기 때문에, 상수1에 대해 &1 연산을 할 수 없는 것처럼, this도 메모리를 알아낼 수 없다고 이해했습니다. 하지만 그렇다고 하기엔 어셈블리어 코드에서는 마치 this 라는 공간이 있고, 여기에 어떤 값을 집어 넣거나 빼는 것으로 동작하고 있지 않나요? mov dword ptr[this], ecx mov eax, dword ptr[this] this가 메모리를 차지하고 있지 않다는데, 왜 어셈블리어에서는 메모리에 있는 것처럼 표현되고 있는지 궁금합니다.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
궁금한게 있는데 vs 언어팩은 보통 한글을 쓰나요 영어를 쓰나요?
기존엔 영어를 못하기도 해서 한글을 사용했는데다른 외부라이브러리를 사용하는걸 보고따라하려고 해보니까vs를 한글팩으로 사용하면 오류가 뜨더라구요그래서 영어팩으로 바꿔서 사용하는데 좀 어색하더라구요그러다보니 궁금한게현업에선 vs를 사용할떄 영어로 사용하시나요??지금이라도 영어로 사용하는걸 익숙해져야 하나요??
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
강의 관련...
안녕하세요 이번 강의를 듣다가 궁금한 점이 있습니다 1. section .bss에서 변수를 선언할 때는 변수이름 크기 개수로 해야 한다고 하셨었는데 그렇다면 e resb 8과 e resq 1은 동일한 의미인가요? 2. mov [a], byte 0x55에서 byte를 써줘야되는 이유는 상수를 넣을 때 크기를 맞춰줘야하기 때문이라고 하셨는데 mov [a] byte 0x0055 mov [a] word 0x66 으로 고쳐서 실행했는데도 정상적으로 작동이 되었는데 크기를 맞춰줘야 한다는 게 정확히 어떤 의미인지가 궁금합니다 3. 마지막으로 16진수 숫자 2개를 합하면 1바이트를 쓰게 된다고 하셨었는데 무슨 뜻인지 이해가 잘 가지 않습니다 항상 좋은 강의 감사합니다!
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
구조체랑 배열
안녕하세요 오늘 배열까지 배우고 가지고 있는 의문점에 대해서 질문 드립니다.간단히 예시 코드를 만들어 주석으로 질문을 달았습니다. #include <iostream> using namespace std; int arr[10]; int arr_two[10]; struct Test { int arr[10]; }; int main() { arr[0] = 'h'; // 식이 수정할 수 없는 lvaule라 대입 할수 없음. //arr_two = arr; Test one, two; one.arr[0] = 'h'; // 반면에 구조체의 경우, 구조체 내에 배열을 포함해도 값복사가 이루어 짐. two = one; // 구조체를 단순히 변수들의 묶음이라 생각하면 이해가 안됨. } 아직 어셈블리 분석을 잘 못해서 잘 이해가 안갑니다..
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
부동소수점 지수에 관한건데
단 지수는 unsigned byte라고 가정하고 숫자 + 127 을 만들어주는 이유는 혹시라도 지수가 커질 것을 대비해 254를 더하는 것이 아닌 그의 반절 127을 더하는 것으로 이해하면 될까요? 그리고 double의 지수 부분에 대해서 궁금한게 있는데 float가 지수부분이 8이라서 1바이트라면 double의 지수는 11인데 몇바이트로 계산하는 것이 아닌 11비트로 계산하면 되는 걸까요? 제가 이해한게 맞는지 궁금합니다
- 해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이해한게 맞는지 더 알아야 될게 있는 건지 궁금합니다
영상에서 포인터와 배열의 차이점을 제가 받아들인대로 설명하면 포인터의 경우 문자열의 첫번째 주소만을 담는다. 따라서 어떤 문자열을 담던지 용량은 고정이다. 배열의 경우 모든 문자열을 한글자씩 다 각 바구니안에 담아준다. 따라서 문자열에 따라 용량이 커질수도 있고 작아질 수도있다. 포인터와의 공통점은 배열도 포인터처럼 첫번째 주소를 알수 있기 때문에 포인터처럼도 사용할 수 있다. 정리 공통점 : 둘 다 첫번째 주소를 이용해 데이터를 다룰 수 있다. 차이점 : 포인터는 고정용량, 배열은 가변용량 이렇게 이해하는게 맞을까요?? 추가로 뭔가 잘못알고 있거나 더 이해해야 할게 있으면 알려주세요! 감사합니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
맥북 사용자는 SASM을 다운로드하지 못하는데 혹시
NASM을 다운로드 해서 어떻게 설정하는지 알려주실 수 있나요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
main 함수의 스택영역 세팅은 누가 해주나요?
함수가 호출될 때 그 함수의 [매개변수]와 [RET]를 이전 함수가 세팅해준다고 한다면, 가장 최초로 실행되는 함수인 main 함수의 [매개변수]와 [RET]는 누가 해주는 것인지 궁금합니다. main 함수의 이전 함수를 도대체 뭐라고 생각해야 할까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
완강했습니다!
짧은기간에 연달아 질문을 남겼는데도 일일히 다 답해주셔서 감사합니다! 사실 중간중간 질문글을 장문으로 쓰다가 지운것도 꽤 됩니다 ... 그래도 이 강의 덕분에 어디가서 C++을 모른다고는 안 할수 있을정도는 된것 같아요! 이제 오늘부터 2강 수학, dx12와 서버쪽강의를 같이 시작하려고합니다! 강의를 들으면서 강의 내용을 기반으로 저만의 게임을 만들어보려고합니다! 언리얼과 자체 서버를요! 글이 질문부분에 있는지라... 서버를 window/linux 관계없이 돌아가는 프로젝트를 만든다면 cmake프로젝트로 만들면 될련지요? 아직 자세히는 모르지만 운영체제에 종속되지 않은 C++자체의 기능? 으로 만들어가면 되지 않을까 어렴풋이 생각하고 있습니다. 아마 그부분으로 넘어가면 전보다 훨씬 질문이 많아질지도 모릅니다. 아무쪼록.. 다시한번 잘 부탁드립니다. 이렇게 좋은강의를 만들어주셔서 다시한번 감사드리고 새해 복 많이받으세요!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
제가 이해한부분이 맞는지 궁금합니다 오른값, 최적화
프로그래밍을 할때는 안전하게 할 수 밖에없는데 안전을 위해 인수로 받은 값을 함부러 할수가 없었죠. 예를들어 들어온 인수를 멋대로 nullptr로 바꿨다가 밖에서 접근하려 하면 크래시가 날테니 말이죠. 그 인수가 오른값인지 아닌지 판별할 방법이 없었으니까요 . 그래서 c++11이전에는 항상 깊은복사로 사용해 오던 많은 함수들이 넘겨받은 인자가 오른값의 경우에는 깊은복사로 동작할 필요가 없어지고 단순히 포인터만 넘겨받는식의 얕은복사로 작동하게 만들 수 있게 되면서 속도가 빨라질 수 있어졌다. 프로그래밍할때 '만약'을 위해 희생된 속도를 다시 올려줄 수 있게 됐다. 또 오른값이라는 개념으로 인해 template이나 auto같이 형식을 연역하는 부분에 있어 오른값이라는 새롭게 구분해야하는게 생겼는데 이걸 오른값전용 rvalue_template같은식으로 따로 만들지 않고 조건에 따라서는 한번에 만들 수 있게 해주고 들어온 값이 오른값인지를 std::forward() 의 반환값으로 오른값/왼값을 반환해서 판별할 수 있게 해줬다. 여기서 오른값인지 왼값인지 전달해 주는게 전달참조 라고 이해했는데 혹시 잘못된 부분이 있을까요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
이중포인터로 해결 불가능하다 하셨는데
처음에는 고민하다가 공격대상을 공격하기 직전에 대상을 확인하고 공격하는으로 해결했습니다만 (delete 코드 이후에 포인터를 받아서 썻습니다) 나중에 코드 추가등으로 인해 지금은 직전에 대상을 확인한다고 해도 그 사이에 대상 객체가 delete될수도 있겠다 싶어서 좀더 범용적인 해결방법을 위해 이중포인터로 해결을 했습니다. 전체 코드가 너무 긴 듯해 기본적으로 _target을 Player**로 들고있고 _target을 사용하는부분을 모두 (*_target)으로 수정했습니다. *Exercise_A.cpp Arrow 생성되는 구문 Arrow* arrow = new Arrow(reinterpret_cast<Player**>(&knight), archer->_attack); 이 방법이 조금 더 범용적이라 생각했던 이유는 delete를 했을때 자신이 가지고있는 포인터는 nullptr로 바꿀 수 있으나 이걸 복사해 간 다른 포인터 변수들은 초기화 되지 않기 해당 포인터 자체를 가르키는 이중포인터로 해결하면 된다 생각했습니다. 이때 포인터를 하나를 두고 해당 포인터를 참조하려고하는 모든 이중포인터는 해당 포인터를 가리키게 한 뒤 nullptr체크를 한다면 해결 가능하다 생각했는데 혹시 어떠한 경우에 문제가 발생하게 되는지 궁금합니다. 만약 이중포인터로 해결이 불가능하다면 결국 어떤 객체의 포인터는 해당 객체를 delete하는곳에서만 관리를 하고 다른곳에서는 포인터를 가져가는게 아니라 해당 객체를 관리하는곳에 말씀하시느 ID등을 이용해서 객체 접근을 시도하는것이 안전한 방법이다 라고 생각했습니다! 이 부분도 혹시 틀린부분이 있으면 지적해주시면 감사하겠습니다. 앗 추가로 이걸 고치면서 static_cast는 이중포인터는 허락 안해준다는걸 알게됬네요!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
문제 4번 질문입니다.
문제는 금방찾았는데 어떻게 고쳐야할지가 고민이더라고요. 오버플로우 문제인데 체력이 회복하는 포션이 생겼는데 최대체력을 만들어도 되는지, 한번 회복량에 제한은 있는지 확실하지 않아 일단 _hp를 __int64로 바꿨습니다. 생각하보면 코드가 문제라기보다는 과도한 테스트가 문제인거 같아보이는데요. 만약 실제 현업에서 너무 오버한 테스트로인한 오버플로우라면 코드를 고치기보다는 해당 테스트를 수정하는편인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
강의에서 어시스트 기능 질문있습니다.
14:45 쯤에 (*_target2).에서 _hp를 자동완성시켜주는데 당시 Player.h, Player,cpp 둘 다 해당 타겟인 몬스터 클래스에 대한 정보는 하나도 없는데 어떻게 몬스터 클래스 내부에 _hp가 있는지 알고 자동완성을 시켜주는지요? 이 부분말고도 그런상황이 자주 나오더군요 선생님께서 visual assist를 사용하고있다는건 초반 강의 질문중에 본것같은데 이녀석의 기능인가요?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
캐스팅 이해
c스타일의 캐스팅은 reinterpret_cast이고 많은 형 변환중에 좀더 안전하게 쓸 수 있게 기능을 제한하고 사용자의 의도를 알수 있게 추가된?것이 const_cast와 static_cast이며 마지막으로 가상함수테이블을 이용해서 추가적인 기능으로 더욱 안전하지만 속도에 손해가 있는 dinamic_cast이다 라고 이해했는데요 혹시 틀린부분이 있나요? 물론 각각의 설명을 하자면 const_cast 상수를 뗴거나 붙여주는역할 static_cast 논리적으로 생각했을때 말이되는경우 사용가능, 단 안전은 보장해주지 않음. dinamic_cast 가상함수테이블을 이용해 실제로 형변환이 가능한지 안전까지 보장해주지만 느림. reinterpret_cast는 그냥 뭐든 변환해줌
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
실행 파일에 새겨진 메모리 주소에 대해 여쭤보고싶어요!
안녕하세요. 강사님. 다름이 아니라 어셈블리어 파트 실습을 저는 우분투에서 나름의 방법으로 수행을 하고 있습니다. gdb로 실행파일을 디버깅할 때 왼쪽편에 보면 0x00000000 과 같이 주소가 기재되어 있는데 해당 주소는 실행파일이 로드되어지는 가상 주소를 의미하는것인지요 ?
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
초기화 리스트 사용에 대해서
초기화 리스트를 사용할경우에 클래스 내부 클래스의 원하는 생성자를 호출 할 수 있는 차이가 있고 클래스 내부에있는 멤버 클래스? 가 기본 생성자가 없을경우에 반드시 초기화리스트를 사용해야 하는거군요. 또 생각해보면 기본생성자가 있다고 하더라도 초기화 리스트를 사용하지 않고 생성자 내부에서 _inventory = Inventory(20); 와 같은식으로 사용할때 결국 복사생성자로 복사가 될텐데 이전 강의에서 말씀하신것처럼 Inventory 클래스의 복사 생성자게 제대로 만들어져 있지 않으면 멤버 변수들 중에 간단히 복사가 안되는것들로 인한 문제가 생길수 도 있겠네요! 그리고 말씀하신 C++11 문법에 추가된 부분은 이 초기화리스트의 다른 표현방식 혹은 문법이라고 이해하면 될까요? 마지막으로 구태여 생성자에서 초기화 하는것과 초기화리스트에서 초기화 하는것에 대해 차이를 둔 점이 예전 전역변수를 초기화 하지않으면 .bss에 위치하고 상대적으로 exe파일 크기를 적게 잡아먹는것처럼 컴파일러 내부에서 최적화하는데 어떤 이점이 있어서 나눈건가요? ----수정이요---- 다음 강의를 듣고 복사 연산자에 대해서 알게되고 다시 생성자 내부에서 초기화 하는 _inventory = Inventory(20); 위와 같은방식으로 했을때 여기서 =는 복사생성자가 아닌 복사 연산자로 작동을 하는군요? 생성자 내부에서 초기화 하려고하는건 결국 멤버내 클래스를 기본생성자로 생성하고(_inventory 생성) 추가로 뒷부분의 생성자로 생성된 임시 객체(Inventory(20))을 복사해서 넣는 식으로 작동하는군요! 그렇다면 클래스 내부의 멤버 클래스(_inventory )를 복사생성자로 생성하고 싶을때는 해당 클래스의 인수로 복사생성자로 만들고싶은 클래스를 받은 뒤 그걸 초기화리스트로 초기화 하는방법이 멤버클래스(_inventory )를 복사생성자로 생성시킬 수 있는 유일한 방법인가요? 이런식으로요 Knight(Inventory& i) : _inventory(i){}
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
중복헤더 방지에 궁금한점이 있습니다.
구지 둘중 하나만 이용하는게 아닌 둘 다 이용하면 안되나요? 둘 다 이용할 경우에는 다른 문제가 있을까요? 둘 다 이용할 경우 코드 자체는 좀더 길어지거나 지져분해 보일 수 있습니다만 버그나서 꼬일수도 있다는점과 최적화가 될수도 있다는점 둘 다 잡을수 있어 보여서요.
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
class 내부 함수 선언에 대해서 궁금합니다
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. class Car { public: void TurnKey() { RunEngine() } void RunEngine(); } 이렇게 RunEngine이 선언되기 전에 TunrKey에서 먼저 사용되는것이 어떻게 가능한지 알고싶습니다! 일반 함수들을 사용할 때는 허용되지 않았던것으로 알고있어서 혼란이 옵니다 항상 강의 잘 듣고 있습니다 감사합니다
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
const 수식? 질문입니다
const char* p; 의경우 *p의 변경이 불가능한거고 const char** pp; 의 경우에는 **pp의 변경이 불가능한거죵 이때 *pp를 변경 못하게하려면 const수식 위치가 const char* const* pp 가 되어야하니 어떻게 보면 좀더 일반화 된 const의 위치는 char const* const* pp 처럼 * 바로 앞이 규칙적으로 보이는데.. 통상적으로는 TYPE앞쪽에 쓰이나요?