[게임 프로그래머 입문 올인원] C++ & 자료구조/알고리즘 & STL & 게임 수학 & Windows API & 게임 서버
강의에서 설명된 내용 기준으로 argument 10 및 return address가 main함수의 스택 프레임에 있는 것으로 설명되었는데, 실제 코드에서 main함수에서 Test함수를 argument 10을 주면서 호출할 시에 매개변수 10에 대한 값과 추후에 다시 main 함수로 돌아오게 될 위치에 대한 리턴 어드레스 값은 메인 스택 프레임이 아닌 그 아래에 위치할 Test함수의 스택 프레임에 있는 것이 더 정확하지 않나에 대한 질문드립니다.
안녕하세요. 맥 vscode에서 환경을 설정해주고 있는데 질문글에 올라온 링크를 찾아보니 c/c++: edit configuration(ui)에 들어가서 설정을 해준 뒤, c_cpp_properties 파일을 만들어줘야 하는 것을 알게 되었습니다. 그런데 제가 검색했을 때는 edit configuration이 뜨지 않는 상황입니다.. 혹시 어떻게 해야하는지 알 수 있을까요? 참고로 extension에서 c/c++과 code runner는 모두 설치하였습니다.
안녕하세요. 해당 두코드의 차이에 대해서 여쭙고 싶어 CMystring 클래스에는 operator 함수를 구현하지 않은 상황에서 아래 두 코드의 실행 결과가 달라 질문드립니다. 1번 코드 CMystring String3 = String2; 2번 코드 CMystring String3; String3 = String2; 1번 코드에서는 복사가 호출되어 String3에 새로운 메모리가 할당이되고. 2번 코드에서는 단순 대입, 즉 shallow copy 가 일어나는 것을 확인하여 String2와 같은 메모리를 참조하는 것을 확인했습니다. 두코드의 동작 방식을 확인하여 둘의 차이를 간접적으로 확인했으나 정확한 이유를 알고싶어 이렇게 질문게시판에 글을 남깁니다.
void printArray(int array[], int length) { for (int index = 0; index < length; ++index) { cout << array[index]; } cout<<endl; } int main() { int arr[] = { 3,5,2,1,4 }; printArray(arr, 5); for (int i = 0; i < 4; i++) { int smallest_index = i; for (int current_index = i + 1; current_index <5; current_index++) { arr[smallest_index] = (arr[smallest_index]>arr[current_index]) ? arr[current_index] : arr[smallest_index]; } int temp = arr[smallest_index]; arr[smallest_index] = arr[i]; arr[i] = temp; printArray(arr, 5); } } 다음 코드를 실행하면 제대로 된 오름차순 형태의 선택 정렬이 나타나지 않고 35214 15214 11214 11114 11114 이렇게 나옵니다. 숫자가 swap되는 부분이 잘못된 것 같은데 어느 부분을 고쳐야 할까요?
안녕하세요. 강의 영상 1.11에서 3분 15초 부분의 내용과 관련하여 궁금한 점이 있습니다. // main.cpp #include <iostream> #include <cstdio> using namespace std; int add(int a, int b); int main() { cout << add(1, 2) << endl; return 0; } // add.cpp int add(int a, int b) { return a + b; } 저는 맥 vscode에서 실행하고 있고, 강의 영상과 같이 add 함수의 정의와 선언 부분을 분리한 후, main.cpp 파일을 실행하였더니 에러가 떴습니다. add.cpp 내의 add 구현 부분이 링킹이 되지 않은건가 하여 main.cpp파일에 #include "add.cpp"를 하였는데 정상적으로 실행이 되었습니다. 그런데 찾아보니 #include "add.cpp" 자체가 어색하다고 하는데,, 뭔가 다른 방법은 없는지 알고 싶습니다! 어쩔 수 없이 vscode로 따라가다보니 중간중간 어려움이 생기네요.. 감사합니다.
안녕하세요! 큰돌님. 문제를 풀다가 자꾸 visited 배열에 오버플로우가 일어나는 것 같아서 예시 코드와 비교해 봤더니, 큰돌님은 max_n = 104로 배열의 크기를 최대로 정의 해 놓으셨더라구요. 그래서 큰돌님 처럼 다음과 같이 배열의 크기를 최대로 해놓고 하니, 문제가 해결되었습니다. const int max_n = 104; 저는 입력받는 코드를 따로 만들지 않아서, 크기를 예측할 수 있는 코드여서 5X5 로 정의를 해놓았는데, 왜 오버플로우가 일어나는 지 궁금합니다! 제가 작성했던 코드 첨부하겠습니다. // Online C++ compiler to run C++ program online #include <bits/stdc++.h> using namespace std; const int max_n = 104; int dy[4] = {-1, 0, 1, 0}; int dx[4] = {0, 1, 0, -1}; int main() { int N = 5; int M = 5; int x,y; int visited[N][M] = {0,}; //방문 노드 //시작 지점 int sx = 0, sy = 0; //끝 지점 int ex = 0, ey = 4; //MAP int map[N][M] = { {1,0,1,0,1}, {1,1,1,0,1}, {0,0,1,1,1}, {0,0,1,1,1}, {0,0,1,1,1} }; queue<pair<int, int>> q; //깊이 탐색을 위한 큐 visited[sy][sx] = 1; // start 위치 방문 처리 q.push({sy,sx}); while(q.size()) { tie(y,x) = q.front(); q.pop(); for(int i = 0; i < 4 ; i++) { int ny = y + dy[i]; int nx = x + dx[i]; if(ny < 0 || ny >= N || nx < 0 || nx >= M || map[ny][nx] == 0) continue; if(visited[ny][nx]) continue; visited[ny][nx] = visited[y][x] + 1; q.push({ny, nx}); } } printf("%d\n", visited[ey][ex]); // 최단거리 디버깅 for(int i = 0; i < N; i++){ for(int j = 0; j < M; j++){ cout << visited[i][j] << ' '; } cout << '\n'; } return 0; }
안녕하세요 큰돌선생님.. 해당 문제를 풀었는데 예제 입력 1번과 2번까지는 잘 나오는데 나머지가 틀렸다고해서 질문드립니다. 선생님 코드와 아주 큰 틀에서는 비슷한것 같긴한데, 제 코드가 우선 깔끔하지는 못한것 같습니다. 따로 변환된 좌표를 받아서 원복시키는것이 아닌 flag 변수를 사용하여 원복시키는 코드로 작성하였습니다.. 오래 생각해보았는데 진전이 없어 질문드립니다. 혹시 어떤 부분이 잘못된 로직인가요?? http://boj.kr/468e705a31f141d7aaf8dea5cc6f4dfd
- 학습 관련 질문을 남겨주세요. 상세히 작성하면 더 좋아요! - 먼저 유사한 질문이 있었는지 검색해보세요. - 서로 예의를 지키며 존중하는 문화를 만들어가요. - 잠깐! 인프런 서비스 운영 관련 문의는 1:1 문의하기를 이용해주세요. 안녕하세요 선생님. 일단 문제는 동전뒤집기와 같은 원리로 풀긴 했습니다만 지금까지 풀면서 느낀건데 약간 이번에 0,1로 나누는 것처럼 새로운 아이디어를 아에 생각해내지 못하는 것 같습니다. 뒤로 갈수록(문제티어가 올라갈수록) 이런 생각들이 많이 필요한지(?) 궁금합니다. 추가로 제가 작성한 코드에 이런 코멘트가 달렸습니다. 연산자 우선순위 때문에 괄호를 명확히 써달라는거 같은데 무시해도 되는 부분인가요? Main.cc: In function ‘int main()’: Main.cc:45:33: warning: suggest parentheses around ‘+’ inside ‘<<’ [-Wparentheses] 45 | for(i = 0; i < (1 << (X-1)*Y+1); i++) { | ~~~~~~~^~ http://boj.kr/7f52d75051654e338b6b5d369cc55202
#include <iostream> #include <vector> #include <queue> using namespace std; #define ll long long #define endl "\n" void merge(int a, int b); int find(int a); vector<int> parent; vector<int> paths; int main() { ios_base::sync_with_stdio(false); cin.tie(NULL); cout.tie(NULL); int n, m; cin >> n; cin >> m; parent.resize(n + 1); for (int i = 0; i <= n; ++i) { parent[i] = i; } for (int i = 1; i <= n; ++i) { for (int j = 1; j <= n; ++j) { int v; cin >> v; if (v == 1) { merge(i, j); } } } for (int i = 1; i <= n; ++i) { int n; cin >> n; paths.push_back(n); } int prevPath = find(paths[0]); for (int path : paths) { int curPath = find(path); if (curPath != prevPath) { cout << "NO"; return 0; } prevPath = curPath; } cout << "YES"; return 0; } void merge(int a, int b) { a = find(a); b = find(b); if (a != b) parent[b] = a; } int find(int a) { if (a == parent[a]) return a; return parent[a] = find(parent[a]); } 왜맞틀인거같은 느낌이 듭니다. 책에 있는 내용 분석해서 이해는 하였는데 제가 짠 코드가 왜 틀린것인지 모르겠습니다. 의심되는 부분은 처음에 merge하는 for문인거같은데 책처럼 인접리스트를 사용하지 않고 v가 1이라면(i행과 j열이 연결되어 있다면) 그냥 바로 merge하여 병합하였는데 이부분에 예외가 있는것인지 아니면 다른 부분에서 예외가 있는것인지 감이 안 잡히는데 어디가 잘 못된것인지 한번 봐주실 수 있나요? 감사합니다 :)
안녕하세요. 강의 잘 보고 있습니다. 강의 내용 중 하나 이해 안되는 것이 있어 질문 남깁니다. // 위 코드 생략 TestData testFunc(TestData& rhs) { // 생략 } int main() { TestData result = testFunc( 10 ); // 생략 } testFunc의 매개변수로 10이 넘어갔기 때문에 묵시적으로 변환 생성자 TestData(int)가 호출된 것으로 보입니다. 따라서 testFunc은 생성된 TestData를 참조로 받고 있는 것 같은데, 왜 위처럼 코드를 작성하면 오류가 발생하는지 이해가 되지 않습니다. // 위 코드 생략 TestData testFunc(const TestData& rhs) { // 생략 } int main() { TestData result = testFunc( 10 ); // 생략 } 위처럼 const 키워드를 붙였을 땐 오류가 안 발생하는데 이유가 무엇인가요?
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
소멸자에서 if (_pet) 은 pet이 nullptr이 아닐 때 참이되어 _pet을 지울건데 이동대입연산자에서 knight의 _pet을 nullptr로 바꾸면 소멸자의 if문을 통과하지 못해서 _pet이 삭제되지 않는거 아닌가요?? 이동대입연산으로 똑같은 pet을 만든 다음에 pet을 넘겨줬으니까 삭제해도 되는거 아닌가 해서 질문드립니다
해당 강의가 없어 직접 질문 하게 되었습니다. 2251번 책을 보면 이동 가능한 경로가 A -> B, A ->C, B -> A, B -> C, C -> A, C ->B 로 총 6개인것은 이해를 했습니다. 근데 최초의 물이 C에만 담겨있는데 왜 sender, receiver를 6크기의 배열로 선언해주고 아래처럼 for문을 돌리고 없는 물을 처음에 6개의 경로에 따라 퍼다 나르는지 이해가 잘 가지 않습니다. for (int k = 0; k < 6; ++k) { // next[0] = a, next[1] = b, next[2] = c int next[] = { a, b, c }; next[Receiver[k]] += next[Sender[k]]; next[Sender[k]] = 0; // 대상 물통의 용량보다 물이 많아 넘칠 때 if (next[Receiver[k]] > now[Receiver[k]]) { // 초과하는 만큼 다시 이전 물통에 넣음 next[Sender[k]] = next[Receiver[k]] - now[Receiver[k]]; // 대상 물통은 최대로 채움 next[Receiver[k]] = now[Receiver[k]]; } // A와 B의 물의 양을 통하여 방문 배열 체크 if (visit[next[0]][next[1]] == false) { visit[next[0]][next[1]] = true; q.push(make_pair(next[0], next[1])); // A의 물의 양이 0일 때 C의 물의 용량을 정답 변수에 저장 if (next[0] == 0) { ret[next[2]] = true; } } }
삼각형 띄우기 31분 쯤 나오는 LosdShaderFromFile함수 작성시에 저는 string 헤더 추가하라고 오류가 뜹니다. (물론 추가 하는게 문제는 아닌데,) 선생님께서 올려주신 파일을 보니 별도로 추가 되어있지 않아서요,,,, 궁금해서 올려봅니다(너무 하찮은 질문이지만...ㅜㅜ )
http://boj.kr/7687fd79d7f14a06876f12bc7d02e5a7 안녕하세요 선생님 제 생각이 틀린 건 분명한데 어떻게 틀렸는지 이해가 잘 안됩니다 if(s[i] >= 'A' && s[i] <= 'Z'){ s[i] = s[i] + 13; if(s[i] > 'Z') s[i] = s[i] - 26; }else if(s[i] >= 'a' && s[i] <= 'z'){ s[i] = s[i] + 13; if(s[i] > 'z') s[i] = s[i] - 26; } 아마 이부분에서 논리적인 오류가 있는것 같은데 잘 모르겠습니다 제 생각에 13을 먼저 더하고 그 이후에 범위를 벗어난 부분만 26을 빼면 될거라 생각했는데 이게 왜 안되는지 이해가 잘 안됩니다. ps. 새해 복 많이 받으세요
안녕하세요. 3:00 영상 초반에 클래스 외부에 add함수를 작성한 예제를 보여주셨는데, 해당함수는 레퍼런스로 c1 , c2 , c_out 을 인자로 받고 있습니다. 레퍼런스로 받을경우 그 인스턴스의 메모리상 주소값을 그대로 받아오기 때문에 c.m_cents 처럼 private 에 속하는 멤버변수도 직접 접근이 가능해야 되는거 아닌가요...? 레퍼런스로 인자를 받았다면 객체 그 자체로 private 영역에 접근이 가능해야될것 같은데, getter , setter 함수를 사용해서 private 변수에 접근해야되는 이유를 모르겠습니다ㅠ void add(const Cents &c1 , const Cents &c2 , Cents &c_out) { c_out.getCents() = c1.getCents() + c2.getCents(); }
class Something { private: int some; public: Something(const int &in_some) : some(in_some) {} void print() { cout << some << endl; } }; class Fraction { private: int nom; int denom; Something frac_some{ 3 }; // uniform init public: Fraction(const int &in_nom, const int &in_denom) : nom(in_nom), denom(in_denom) {} void print() { cout << nom << " " << denom << endl; frac_some.print(); } }; int main() { // Fraction frac(1, 2); Fraction frac{ 1, 2 }; frac.print(); return 0; } 위 코드처럼 Something frac_some{ 3 }; 으로 uniform init을 하면 코드가 동작합니다. 그러나 아래처럼 direct init을 하면 위와 같이 오류가 발생합니다. 어떤 차이가 있는 것일까요? main에서 아래처럼 두 가지 방법을 다 해보았을 때는 문제가 없었습니다 main에서 Fraction frac(1, 2); 을 하는 것과, 클래스 내에서 멤버 변수를 선언할 때, Something frac_some(3); 을 하는 것이 다른 동작인가요? 항상 감사드립니다.