안녕하세요!
Posts
Q&A
질문입니다
안녕하세요? 질문&답변 도우미 durams입니다.입출력 버퍼에 대한 설명이 등장하기 전이라 자세한 설명을 드리기 어렵기에 간단히 설명드리자면, 프로그램 실행 시 나타나는 콘솔 창은 프로그램이 출력하는 내용만이 나타나는 것이 아니라 사용자가 입력하는 문자들이 나타나는 곳이기도 합니다.개행 문자를 출력하도록 프로그래밍한 것과는 관계없이, 개행 문자를 입력하는 행위도 콘솔 창에서의 개행을 수행합니다.
- 1
- 2
- 19
Q&A
질문입니다.
안녕하세요? 질문&답변 도우미 durams입니다.말씀해주신 부분은 해당 코드가 문제가 있다는 내용이 아닙니다. 실습하기 쉬운 방식으로 먼저 학습을 진행하겠다는 의미입니다.
- 1
- 1
- 15
Q&A
이중포인터와 배열이 이해가 안됩니다.
안녕하세요? 질문&답변 도우미 durams입니다. int row = 3; int col = 5; int* r1 = new int[col] { 1, 2, 3, 4, 5 }; int* r2 = new int[col] { 6, 7, 8, 9, 10 }; int* r3 = new int[col] { 11, 12, 13, 14, 15 }; int** rows = new int* [row] { r1, r2, r3 };동적 할당을 이미 학습하셨으니 r1, r2, r3에 대해서는 이해하셨을겁니다. 이 세 포인터는 모두 new int[col]로 동적 할당을 진행하는데요, int를 col개만큼 담는 배열의 크기만큼을 힙에 할당했을 때 그 시작 주소를 가리키는 변수라는 의미가 됩니다.동일한 원리를 rows에 적용하면 new int* [row]를 통해 int*를 row개만큼 담는 배열의 크기만큼을 힙에 할당했을 때 그 시작 주소를 가리킨다는 의미가 됩니다.(사진)
- 1
- 2
- 29
Q&A
5분 17~5분 34초 객체 잘림 질문
안녕하세요? 질문&답변 도우미 durams입니다.제가 예전에 썼던 글을 잘 봐주셨네요. '위의 설명들'은 맞는 내용입니다. 다만 언급해주신 5분 17초부터의 내용에 대해서는 조금 설명이 필요합니다.그렇다면 5 분 17초에서 임시 객체를 throw하고 있고 매개 변수는 참조의 형태를 가지고 있기 때문에 객체 잘림이라는 설명은 맞지 않고 다형성의 자식의 객체를 부모의 참조로 조작하는 경우인 것 아닌가요?: 아마 영상의 해당 부분에서 report 함수의 출력이 Exception report로 나온 이유가 객체 잘림 때문이 아닌 것 같아서 의문을 표하시는 것으로 보입니다.저도 질문자님의 글을 보고 영상을 다시 보면서 찾은 사실이지만, 결론부터 말씀드리자면 강의에 미묘한 오류가 있습니다. 제가 이전에 작성했던 글을 보셨으니 알고 계실 테지만, catch문에서 객체를 &(reference)로 잡았기 때문에 오히려 object slicing는 제대로 방지되고 있습니다.해당 부분에서 Array exception이 아닌 Exception report가 출력된 이유는 report 함수가 오버라이딩되지 않았기 때문입니다. 강의에서 사용하는 코드를 잠깐 보시면 아래와 같습니다.class Exception { public: void report() { cerr 강의에서도 report 함수를 오버라이딩했다고 소개하지만, 사실 이건 오바라이딩이 아닌 아무 관계가 없는 별개의 함수 정의라고 봐야합니다. 왜냐하면 Exception의 report에 virtual 키워드가 없기 때문입니다. 즉 다형성이 동작하지 않습니다. 런타임 다형성을 위한 v-table 정보가 생성되지 않으며, ArrayException 객체를 Exception& 에 할당해서 report를 호출하더라도 단순히 Exception::report가 호출됩니다.즉, 강의 코드대로 작성하면 catch(Exception& e)처럼 object slicing을 방지하도록 catch문을 작성한 것과 관계없이 애초에 런타임 다형성이 동작하는 형태가 아니기 때문에 Exception의 참조에서 호출한 report는 언제나 Exception report를 출력하게 됩니다.해결 방법은 진짜로 오버라이딩을 하면 됩니다.class Exception { public: virtual void report() { cerr 이렇게 하면 질문글에 첨부해주신 제 코드의 doSomething 내에서 catch했을 때 제대로 Array Exception report이 출력됩니다. 대신 main에서 catch해서 나오는 출력문은 그대로 Exception report인데요, 이건 왜 그런지 한 번 생각해보셨으면 좋겠습니다.질문은 이어서 주셔도 됩니다.
- 1
- 1
- 38
Q&A
Resource.h 코드 알려주세요
안녕하세요? 질문&답변 도우미 durams입니다.166 15.1 이동의 의미와 스마트 포인터의 시작 부분을 보시면 Resource.h가 나오니 참고해주세요.
- 1
- 1
- 27
Q&A
char name[] 배열의 길이와 관련해 일부 궁금점이 생겨서 질문합니다
안녕하세요? 질문&답변 도우미 durams입니다.name은 C-style 문자열로 널 문자를 포함하므로 길이인 n_name은 10입니다. 그리고 *p가 널 문자일 때 p에서 문자열의 시작 주소를 빼면 그 값은 널 문자를 제외한 문자열의 길이가 되겠지요.디버깅을 통해서 많은 걸 얻어가실 수 있으니 꼭 습관처럼 해 주세요.
- 1
- 2
- 39
Q&A
10.13 관련 출력 질문
안녕하세요? 질문&답변 도우미 durams입니다.printf는 지정한 여러 Conversion specifiers에 따라 인자를 해석합니다. 코드에서 보이는 %s는 인자를 문자열로 해석하며, 정확히는 주어진 인자를 '문자열이 시작되는 주소'로 인식하고 '문자열의 끝'이라고 인식되는 널 문자를 만날 때까지 출력하는 동작을 수행하게끔 합니다. 반면 %u는 인자를 부호 없는 정수로 해석하기 때문에 name[i]가 의미하는 주소 자체를 uint 타입으로 보고 출력하게 됩니다.aname을 1차원 인덱스만 사용하여 인덱싱한 aname[0], aname[1] ... 은 각 문자열의 시작 주소를 가리킵니다. printf에 인자로 전달하여 문자열을 출력할 수 있습니다.
- 1
- 2
- 48
Q&A
이런 방식으로 작성해도 되나요?
안녕하세요? 질문&답변 도우미 durams입니다.입력 버퍼에 남은 개행 문자를 제거하는 적절한 코드는 while(getchar() != '\n') 입니다.while 문에 진입하기 직전에 입력 버퍼가 어떤 상태일지 고민해보시고, 해결이 되지 않는다면 다시 질문주세요.디버깅을 해보시는 것도 좋습니다.
- 0
- 2
- 71
Q&A
강의 9.11의 12분 20초 경에 my_print_functions.h를 include 하는 이유?
안녕하세요? 질문&답변 도우미 durams입니다.네, 현재 예제에서는 my_print_functions.c 파일에서 #include "my_print_functions.h"가 없어도 동작하는 것이 맞습니다. 다만 이는 호출하고자 하는 함수에서 필요로 하는 선언이 printf 단 하나뿐인 매우 간단한 경우이기 때문입니다.함수 내에서, 외부에서 정의된 변수나 함수 또는 구조체 등을 사용한다면 모두에 대한 선언이 그 이전에 되어있어야 합니다. 이번 예제에서 #include 해준 게 그 예시라고 보시면 되겠습니다.강의에서 보여준 것은 일반적인 경우 이렇게 프로그래밍한다는 가이드라인이라고 생각하시면 될 것 같습니다.
- 1
- 2
- 46
Q&A
텍스트 파일 읽기
안녕하세요? 질문&답변 도우미 durams입니다.Visual Studio에서 상대경로를 사용할 때 그 기준이 되는 디렉토리는 각 프로젝트 속성의 Working Directory가 결정합니다. 아래 이미지를 참고해서 $(ProjectDir)로 설정되어있는지 확인해주세요. (사진)만약 이렇게 설정하더라도 고쳐지지 않는다면 질문자님께서 두번째로 첨부해주신 이미지의 디렉토리(.exe파일들이 있는 곳)에 myfile.txt파일을 위치시키고 시도해보세요.현재 제시해주신 문제와는 관련이 없지만, 강의의 코드와는 다른 부분이 존재합니다. 결과에도 영향을 주는 부분이니 한 번 찾아보세요.해결이 되지 않는다면 다시 질문주세요.
- 1
- 2
- 44