월 22,000원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 해결됨[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++ 프로그래밍 입문
오른값 참조 활용방식
수업을 들으면서 오른값 참조를 어떻게 활용할 수 있는 생각해봤는데 그럼 파티원들이 단체로 던전에 입장을했고 그 던전에서만 사용되는 특정 장치나 아이템이 있는경우 던전 함수에서 임시 객체로 장치를 생성하고 플레이어들이 하나만 존재하는 그 장치의 소유권을 주고 받으면서 이용하는 구현을 할때 활용 할 수 있는건가용??? 함수 인자로 임시객체를 생성하니 알아서 스택에 생성되고( 던전 함수 내부에서 생성할 필요 없음)+ 후에 신경써서 정리해주지 않아도되는 편리함에 사용하는건가요???
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
문자열
안녕하세요, C# 완강 후 C++ 강의도 잘 듣고 있습니다! C++을 하면서 C#은 다 까먹었지만요... ^^;; 아무튼, 아직 강의를 전부다 듣진 않았지만.. 문자열 구현하는 것에 대해서 C스타일 배열로만 알려주셨는데 다른 책들을 참고하면 C스타일 배열 대신 string을 쓰라고 하더라구요 . 프로그래머스 같은 데서 코딩테스트 할 때도 string을 사용하도록 되어있던데 C++의 string 대신 C스타일 배열로 설명해주신 이유가 있는지? 궁금합니다. 감사합니다!!
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
ReverseStr 함수 질문
저는 선생님과 다르게 포인터를 끝까지 이동시킨 뒤에 하나씩 출력해서 앞으로 오게 하고싶었는데 동작 자체를 안해서 뭐가 잘못된건지 모르겠습니다...
- 미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
StrCmp 함수 질문
1. 비교 함수를 선생님과 다르게 포인터로 짜보고 싶었는데 왜 Hella와 Hello가 계속 같다고 나오는지 이해가 안됩니다.
- 미해결[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에 값이 복사가 되는 것인가요...?