안녕하세요. 강의 잘 보고 있습니다. 강의를 보는데 갑자기 궁금한 것이 생겨서 질문 드립니다. exe 파일에서 필요할 때마다 dll을 참조하여 호출하는 것으로 이해하고 있습니다. dll엔 이미 함수 symbol이 정의되어 있겠죠. 예를 들어 add(int a, int b) 함수를 dll로 만들었다고 가정하면 일반적인 c라면 함수 심볼이 _add라고 예상되지만, C++ 이라면 _add가 아니라 다른 형태의 심볼이 만들어질거라 생각이 됩니다. 그런데 exe을 만드는 개발자 입장에서 생각해보면 무엇으로 만들어질지 모르는 심볼을 예측할 수 없으니 c처럼 _add와 같이 확실한 symbol을 선호할 것 같은데, 그러면 dll 파일을 c++로 만들 때 함수 앞에 extern "C" 키워드를 사용하나요? 만약 1번 답이 맞다면 추가로 궁금한 것이 있습니다. 제가 알기론 C와 C++의 차이가 name mangling 뿐만 아니라 스택에 쌓이는 매개변수도 차이가 있다고 들었습니다. 그런데 C++로 만드는 exe 파일과 extern "C"로 선언한 dll을 같이 사용하면 문제가 생기지 않나요? 부족한 것이 많아 질문에 오류가 있을 수 있습니다. 제가 잘못 알고 있는 부분은 피드백 주신다면 다시 공부하겠습니다. 감사합니다.
안녕하세요. 아래와 같은 코드가 있다고 가정했을때, 첫번째 operator(friend 키워드가 없는)는 에러표시를 하고 두번째 operator(friend 키워드가 있는)는 정상 컴파일이 됩니다. friend 키워드에 대한 강의도 앞에서 보았고, 'private 멤버 함수에 대한 접근이 가능하도록 해준다' 는 생각과 operator 코드 작성간의 상관관계가 무엇인지 모르겠습니다 ㅠ // 아래 함수 정의에선 해당 오퍼레이터 함수에 인자값이 너무 많다고 하고, std::ostream& operator << (std::ostream &out, const Point& point) { } // friend 키워드를 붙일경우엔 정상 컴파일이 됩니다. friend std::ostream& operator << (std::ostream &out, const Point& point) { }
10:00 경 "근데 지금 값이 참조자인 ref에 들어있는 값하고 요놈하고 똑같죠. 네 그래서 여기에다 대고 그래서 간접지정해서 30 이러면은 F10키 눌러 보면 여기 데이터의 값이 바뀌는 걸 보실 수가 있죠? 네 데이터 출력하면 당연히 30이 나오겠네요. 해서 여러분이 지금까지 이만큼의 내용을 보셔서 아시겠지만 참조자라고 하는 것은 개념적인 표현이고 참조자의 실체는 포인터랑 똑같이 구현이 돼요. 그래서 기계어 수준으로 내려가서 쫓아가 보면은 결과적으로는 그렇다. 그래서 참고하시기 바랍니다. 아, 참조자 이런 거구나." 인데 이게 스크립트에서 이상하게 표시가 됩니다. 처리 부탁드릴게요. 고맙습니다!
7:38초 경 텍스트가 그러면 그거랑 5랑 더해서 연산의 임시결과가 떨어졌겠죠 그게 15가 저장되어 있는 integer 인스턴스일텐데, 사라져야 될 운명이었으나 거기에다 이름을 부여한거죠. 인데 수정 제안할랬더니 길어서 짤리네요. 관리자분께서 스크립트 시간 자른 후 나눠서 바꿔주셔야 할 것 같아요. 지난 시간 것도 유사한 게 있었어요. 통으로 날아가 있어서... 조치 부탁드립니다! 노트 필기하는 마음으로 스크립트 수정 중입니다. ㅎㅎ
안녕하세요, 강의를 잘 듣고 실습 중 질문이 있습니다. 알고리즘 교안 116페이지 Ralo구조체 예제 코드 진행 시 출력물에 대한 질문입니다. #include <bits/stdc++.h> using namespace std; struct Ralo { int a, b; double c, d, e; }; void print(Ralo ralo) { cout << ralo.a << " " << ralo.b << " " << ralo.c << " " << ralo.d << " " << ralo.e << '\n'; } int main() { Ralo ralo = {1, 1, 1, 1, 1}; print(ralo); vector<Ralo> ret; ret.push_back({1, 2, 3, 4, 5}); ret.push_back({1, 2, 3, 4, 6}); ret.push_back({}); ret.push_back({1, 3}); for (Ralo ralo : ret) { print(ralo); } return 0; } 위 예시에서 a, b의 자료형은 int이고 c, d, e 의 타입은 double라고 먼저 선언을 하게 되는데, main함수에서 출력 시 왜 일관되게 정수형으로 출력되는지 이해가 안됩니다.(형변환이 일어나야하거나, 타입 불일치에 따른 에러가 떠야 하는게 맞는거 아닌가요 ?!) 제가 부족한 개념이 많이 있을 수도 있으니 너그럽게 읽어주시면 감사하겠습니다. ^^;;
안녕하세요 큰돌선생님 매번 좋은강의와 코드 감사합니다 강의와 수업을 복습하며 문제를 다시 풀어보았는데요, 제 처음 풀이는 플러드 필을 사용하면 깔끔하게 풀 수 있을것 같아서 적용하여 풀어보았는데, 문제의 예제조차 통과하지 못하여 그냥 새롭게 큐를 계속 새로 만들어서 하는 방식으로 수정하여 통과하였습니다. 근데 첫번째 접근방법의 로직에서 틀린부분이 없다고 생각하는데 혹시 어디가 틀린것인지 봐주실 수 있으신가요? 새롭게 미세먼지가 퍼지는 부분을 큐에 계속 담는 방식을 사용하였습니다. 첫번째 틀린 코드 http://boj.kr/cdaa0817a0054c8aaa05db4a94fd4cc1 수정후 정답 코드 http://boj.kr/48dc28720f1840d78af14656ac682d39
#include <bits/stdc++.h> using namespace std; string s; int cnt[26]; int main(){ cin >> s; for(char a : s){ cnt[a-'a']++; } for(int i = 0; i <= 26; i++){ cout << cnt[i] << " "; } return 0; } 이렇게 실행할 경우 baekjoon을 복붙하면 정상적인 결과가 나옵니다. 나중에 복습할 때 안 보고 풀어봤습니다만... 변수 선언을 다음과 같이 하니까 결과 값이 달라집니다. int cnt[26]; string s; 사실상 순서만 바뀌었는데 왜 이렇게 결과가 바뀌는지 궁금합니다.
안녕하세요. 섹션10 RawBuffer의 _result버퍼 생성시 BUFFER_DESC 설정 부분 질문 드립니다. "B-14)+Viewport" 샘플 코드를 참조하였습니다. RawBuffer.cpp (줄: 120) 을 보면 아래와 같이 작성해주셨는데요 void RawBuffer::CreateResult() { D3D11_BUFFER_DESC desc; _output->GetDesc(&desc); desc.Usage = D3D11_USAGE_STAGING; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; desc.BindFlags = D3D11_USAGE_DEFAULT; // UAV가 연결되려면, USAGE는 DEFAULT여야 함. desc.MiscFlags = 0; CHECK(DEVICE->CreateBuffer(&desc, nullptr, _result.GetAddressOf())); } desc.Usage 에 USAGE_STAGING 을 주셨는데, 아래 BindFlags 옆 주석으로는 "Usage 는 DEFAULT 여야 한다"고 적어주셔서 혼란스럽습니다. 그리고 BindFlags 에 USAGE_DEFAULT 를 주셨는데, 의도 된 값인지, 의도한 값이 아니라면 어떤 Flags 를 주어야 하는지 궁금합니다. 감사합니다.
안녕하세요, 선생님 강의 잘 듣고 있습니다! 6-L 을 풀던 도중, 제 풀이 방법이 틀렸다고 나와 반례가 궁금합니다. 시간 복잡도는 O(n* n/2) 이라 통과 한다고 생각합니다. A[i]에 10을 곱한것은 혹시 모를 부동 소수점 오류가 날지 몰라 처리 해두었습니다. https://www.acmicpc.net/source/70768639
[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
안녕하세요 Rookis님. 강의를 모두 완강하고 포트폴리오를 개선하고 있는 중입니다. 강의 중에 화살을 온라인에 추가할 것이라면 Creature와 GameObject 내용을 수정해야 한다고 하셔서 코드 이사는 완료한 상태입니다. 지금 Arrow는 MyPlayer에서 입력을 받고 State와 WeaponType을 체크하면 Player에서 Scene에 Arrow를 스폰해주는 방식으로 알고 있습니다. 이걸 서버에서는 몬스터나 플레이어를 만드는 GameObject::Create 함수를 파줘서 Arrow를 make_shared로 만들어서 발사 처리를 하게 만들었는데요 서버에서 몬스터가 제거되면 클라이언트에서도 정상적으로 몬스터가 제거되는걸 확인은 했습니다. 그러나 문제가 몇 가지 있습니다. Arrow 스마트 포인터가 해제되지 않는 현상 Arrow 동기화가 종종 씹히는 현상 입니다. 먼저 1번입니다. make_shared로 생성된 Arrow가 해제되지 않음 void Player::UpdateSkill() { if (room == nullptr) return; if (info.weapontype() == Protocol::WEAPON_TYPE_SWORD) { // 내 앞에 있는 좌표 CreatureRef creature = room->GetCreatureAt(GetFrontCellPos()); if (creature) { if (creature->GetType() == Protocol::OBJECT_TYPE_PLAYER) { SetState(IDLE); return; } // 몬스터가 플레이어에게 피격 creature->OnDamaged(shared_from_this()); } } else if (info.weapontype() == Protocol::WEAPON_TYPE_BOW) { ArrowRef arrow = CreateArrow(); arrow->SetDir(GetLookAtDir(GetFrontCellPos())); arrow->SetOwner(shared_from_this()); arrow->room = room; arrow->info.set_posx(info.posx()); arrow->info.set_posy(info.posy()); arrow->SetState(IDLE, true); room->AddObject(arrow); } SetState(IDLE); } 서버쪽의 UpdateSkill 함수인데 여기에서 arrow를 CreateArrow로 만들어서 room에 AddObject로 _arrows map을 만들어 관리를 하고 있습니다. (사실 룸에서 발사체를 관리하는 것이 옳은지도 의문이긴 합니다) void GameRoom::Update() { for (auto& item : _players) { item.second->Update(); } for (auto& item : _monsters) { item.second->Update(); } for (auto& item : _arrows) { item.second->Tick(); } } 그리고 Update 함수, AddObject, RemoveObject도 _arrows map을 처리하게 만들었습니다. 이렇게 처리하다 보니 화살을 제거할 때 몬스터가 피격받는 순간에 해당 화살을 RemoveObject를 실행하니 삭제 이후에 for문을 돌 때 오류가 발생하며 크래시가 발생했습니다. Arrow가 _arrows 맵에서 관리되어서 스마트 포인터가 해제가 안되는 것 같은데, 화살을 어떤 때에서 제거해야 될지 모르겠습니다. 지금은 임시적으로 vector에 참조로 받아와서 Update 하단에서 erase하는 방법을 사용하고 있습니다. 화살 동기화 문제 클라이언트에서는 Projectile 클래스에서 _owner에 대한 정보를 들고 있고 Arrow를 Scene에서 소환할 때 GetOwner 함수로 화살의 주인에 대한 포인터를 들고 있도록 했습니다. 기존에 발사할 때도 S_Move 패킷을 그대로 이용해서 Arrow의 _owner 포인터를 이용해서 위치를 초기화해주고 있습니다. 그런데 두 클라이언트를 접속시켜서 2를 눌러 WeaponType을 Bow로 바꿔서 공격 키로 테스트해보면 종종 반대쪽 플레이어의 화살이 안보이는 경우가 있습니다. 여기에 몇 개의 질문이 있는데요 1) 화살을 생성하고 클라이언트에서 패킷을 전송하는 것이 맞는지 2) 맞다면 어떤 정보를 패킷에 담아야 하는지 3) 서버에서는 어떤 처리를 해주어야 하는지 잘 모르겠습니다. 일단은 Make, Handle 함수를 파서 ObjectInfo를 넣어놓긴 했습니다. 하루 종일 코드를 조작해봐도 해결을 못하고 있습니다.. 도와주세요..
Graphics 11:15 시간에 생성자함수에서 멤버함수를 호출하는데 큰 문제가 되지는 않나요? 검색했을 때 가상함수만 아니면 괜찮다는 글이 많긴 하던데 보통 멤버 함수를 호출해야 하는 경우에는 Init()함수를 따로 만들기만 했었습니다. 그리고 언리얼에서는 생성자 함수에서 멤버함수 포인터를 사용하는 경우에도 에러가 발생했었기 때문에 함수 포인터를 사용하는 경우에는 BeginPlay 함수에서 호출했었습니다.
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 큰돌님 강의 잘 보고있습니다! 2-M문제를 풀때 to_string의 시간복잡도가 O(log n) , find가 O(N)이라서 시간복잡도에 문제가 있을줄 알았는데 해결이 되었습니다. 혹시 이 문제의 시간복잡도는 어떻게 될까요??
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
혹시 char ch3 = 'a' + 1; 이 코드에서 1은 int형 정수로 출력이 되는데 char 타입이 자동으로 변환을 해서 2바이트로 할당하게 되는건가요? 그리고 1이라는 숫자에 마우스 커서를 놔두면 (int)1이라고 표현이 되는데 여기서 1은 데이터타입이 문자가 아닌 정수로 변환해야 해서 자동 변환 시켜주는건지 궁금합니다.