묻고 답해요
164만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C언어
재귀함수에서 출력이 왜 연속으로 이루어지는지 모르겠습니다
void print_binary_rc(unsigned long n){int i = n % 2;if (n > 1)print_binary_rc(n / 2);printf("%d", i);}이게 강의에서 설명해주신 코드였습니다 강의에서 쓰신 print_binary 재귀함수를 그냥 Print_Binary_by_ReCursion의 약어로 pbrc로 표현했습니다.이건 재귀함수가 이루어지는 과정을 제가 생각한 방식대로 도식화 한 것입니다. 인셉션을 예로 들어 설명해주신 것철머 함수 안의 함수 안의 함수 안의 함수가 이루어진다는 것을 확인했습니다.제가 궁금한 것은 위 그림에도 적었듯이 n=1까지 와서 더 이상 n>=2가 되지 않아 if문을 탈출하고 pritnf("%d", i);를 만나게 되는데 그때 맨처음으로 i=1이 출력되는 것은 이해가 되었습니다. 하지만 위 도식의 화살표가 가르키는 것처럼 왜 그 다음 i=0이 출력되는 것인지 모르겠습니다.if 문을 탈출한 것은 n=1인 순간 뿐인데 왜 그 위 과정에서도 i=0을 프린트하게 되는 것인지 궁금합니다. 디버거로 찍어도 잘 안 보여서 질문드립니다. 만약 pbrc(2)가 pbrc(1)의 과정도 포함하고 있어서 프린트를 하는 것이라면pbrc(1)에서 i=1이 출력되고pbrc(2)에서 i=1 i=0이 출력되고pbrc(3)에서 i=1 i=0 i=1이 출력되고pbrc(4)에서 i=1 i=0 i=1 i=0이 출력되어버려서총 1 10 101 1010 라는 10자리 숫자가 출력되어야 한다고 생각이 들어서 이해를 도와주시면 감사하겠습니다 ++ 혼자 고민을 더하다가 제 나름의 답을 얻었는데 혹시 pbrc(1)에서 i=1을 출력하고 나면 이제 그 상위의 pbrc(2)의 단계에서 if문의 반복을 모두 마쳤으니 i=0을 출력하고 그리고 나서 pbrc(5)의 단계에서 if문 반복을 모두 마쳤으니 if를 탈출해 밑에 있는 i=1을 출력하고 마지막으로 pbrc(10)의 영역에서 if문을 모두 마쳤으니 밑의 i=0을 출력한다고 봐야 할까요? 이해가 될 듯하면서도 물고늘어지면 이해가 안됩니다
-
미해결홍정모의 따라하며 배우는 C언어
10.12 2중포인터의 작동원리 질문
10.12 에서 이중포인터 설명하실때int a = 7;int *ptr = &a;*ptr = 8;int *pptr = &ptr;**pptr = 9; 라고 자료화면이 나오면서 설명하시는데y = &x 일때 *y = x , y = &x 라고 알고있는데그렇다면 a = 7 일때 ptr = 7이고 *pptr 도 7이 되야 맞는 문법아닌가요 ?? 제가 잘못알고있는건가요??
-
해결됨홍정모의 따라하며 배우는 C언어
scanf 사용 시 커서 위치 질문
int i=0;scanf("%d", &i);printf("Value is %d\n", i)를 실행하고 i에 7을 입력하면7Value is 7 이라고 나오는데 scanf후에 printf를 실행하면 자동으로 줄이 바뀌는 것인지 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C언어
버퍼 관련
2:30초 쯤에 관련된 질문입니다. 많은 질문들과 답변을 본 이후에도 확신이 가지 않는 부분들이 있어 질문드립니다.Q1)'s' = 스페이스바최초 A's'3's'3's'\n를 입력하게 되면scanf의 경우 개행문자 즉, 공백을 만나는 순간까지만 변수에 저장하는 것으로 알고 있습니다.(이것 또한 맞는지 잘모르겠네요.)그렇기 때문에 버퍼에|A| |3| |3| |\n|가 입력되지만 마지막 3 이후에 's'에 의해 마지막 \n는 버려지고 마지막| |까지만 변수에 저장되는 것이 맞나요??Q2)Q1이 맞다면 처음 루프가 돌고 현재 버퍼에| |가 남아 있는 상태에서 두번째 입력B's'1's'2's'를 받게 되면 버퍼에| |B| |1| |2| |가 버퍼에 남게 되는 것이 맞나요??Q3)Q2)가 맞다면 함수로 진입했을 때 cr에 해당하는 문자는 's' 즉, 공백이 되고 그 다음 변수 자리에 또 문자가 들어오기 때문에 새롭게 초기화 되지 않고 기존의 3, 3을 입력하게 되는게 맞는지, 이전의 's' 공백이 해결되고 다시 루프로 진입하여 그 전에 입력된 B 1 2를 처리하는 것인지 궁금합니다.Q4)추가로 scanf("%c%d%d")와 scanf("%c %d %d")의 차이도 궁금합니다. 또 버퍼에 문자들 사이사이에 's' 즉, 공백의 경우 어떻게 처리되는 건지 궁금합니다. 아직 초보자라 질문의 의도가 정확히 전달되지 않을 수 있을 것 같습니다 이해 안가시는 부분은 다시 한번 알려주시면 감사하겠습니다.
-
미해결홍정모의 따라하며 배우는 C언어
return n*recursive_factorial은 뭘 리턴하는거죠?
long rc_fact(int n){ if (n >= 1) { return n * rc_fact(n - 1); // tail recursion else return 1; }저는 recursive_factorial을 그냥 rc_fact로 줄여서 했습니다루프를 활용한 팩토리얼은 맞췄는데 그땐 결과값을 ans에 리턴한다해서 return ans;라고 하신게 이해가 잘 되었습니다.근데 return n * rc_fact(n - 1) 여기가 이해가 안됩니n에 5라는 값이 들어오고 5>1이므로 if 안으로 들어갈 텐데 뭘 반환해서 어디에 집어넣는다는건가요? 5*rc_fact(4)라는 값을 다시 int n에 집어넣겠다는건가요?그리고 안에 다시 꿈속의 꿈처럼 rc_fact(4)를 진행하고 그 rc_fact(4)에선 또 4*rc_fact(3)을 반환하고 반복하는 것이라고 이해를 했습니다. 하지만 어떤 값을 어디로 return 하겠다는 것인지는 아직 이해를 못했습니다. 이 rc_fact(5) 함수의 결과값이 5*rc_fact(4)인건가요? 즉 최종적으로 rc_fact(5) 함수의 결과값이 바로5*4*3*2*1*rc_fact(0)이 되어서 120이라고 봐야할까요
-
해결됨CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기
15강 Block ID 예제 오류 질문입니다.
안녕하세요?Jetson TX2 및 Xavier를 사용하여 CUDA예제를 실행하고 있습니다.Block 예제에서 tx2와 xavier의 결과가 달라서 질문드립니다.dimgrid<<<2,2,1>>>에 의해 Block의 갯수가 4개가 되고, warpid=0인 영역은 blockid가 (0,0), (1,0), (0,1), (1,1)인 곳에서 총 4개가 있을 것입니다.하지만 Tx2에서 예제를 돌려본 결과 blockid가 (0,0), (1,0)인 곳에만 나옵니다.혹시나 해서 xavier에서 실험을 해본 결과 총 4개가 나와 정상적으로 출력됩니다.CUDA언어는 GPU구조와 상관 없이 출력되기 위해 grid-block-thread 구조를 가지므로 속도는 느리지만 동일한 결과를 출력해야하는데, 왜 tx2와 xavier가 같은 예제를 돌렸는데도 다른 결과가 나오는걸까요? (혹시나 해서 <<<2,2,1>>> => <<<4,1,1>>>로 변경하여 돌려봤지만 여전히 tx2에서 blockid 2개만 출력되었습니다.)
-
미해결홍정모의 따라하며 배우는 C언어
4:15에 나오는 float round-off문제에서 든 생각입니다
float a = 0.01f;변수 a를 이렇게 초기화 하면 실제 a에는0.01이 아니라 0.009999999776이 담깁니다.printf("%f", a);를 했을 때 0.010000이 나오는 이유가0.009999999776이 소수점 일곱번째자리에서 반올림 되어서 그렇게 출력되는게 맞는가요?
-
해결됨홍정모의 따라하며 배우는 C언어
ptr1와 &ptr1의 차이점
안녕하세요~ 강의 1분40초 쯤에printf("%p %d %p\n", ptr1, *ptr1, &ptr1); 코드를 출력하면 값이002AFAEC 100 002AFAE0이렇게 나옵니다.ptr1이랑 &ptr1이랑 arr[0]의 주소를 출력하는 걸로 알고 있는데 다르게 나오는 걸로 보니 제가 잘못 알고 있는 거 같습니다ㅠ ptr1이랑 &ptr1을 출력하면 값이 다르게 나오는데 이 둘의 차이는 무엇일까요? 헷갈리네요아래에 코드도 첨부해 놓았습니다.int main() { int arr[5] = { 100, 200, 300, 400, 500 }; int* ptr1, * ptr2, * ptr3; ptr1 = arr; printf("%p %d %p\n", ptr1, *ptr1, &ptr1); // 002AFAEC 100 002AFAE0 }
-
미해결홍정모의 따라하며 배우는 C언어
MONTHS나 YEARS로 나눌때, double을 쓰신 이유가 뭔가요??
해당 문제에서 평균 온도를 구하실때avg_temp /= (double)MONTHS; avg_temp /= (double)YEARS; 이렇게 작성하셨는데, (double)을 추가하신 이유가 있을까요?? 없어도 잘 작동하여서 여쭤봅니다. 답변해주시면 감사하겠습니다.
-
해결됨CUDA 프로그래밍 (5) - C/C++/GPU 병렬 컴퓨팅 - 아토믹 연산 atomic op
32-2의 warp의 early terminate에 대해 질문드립니다.
안녕하세요!정말 재미있게 강의를 보고 있습니다.그런데 강의 32-2를 보다 궁금증이 생겨 질문 드립니다!warp의 early terminate가 정확히 어떤 동작인지 궁금한데요. 제가 생각해 볼 때 __syncthreads() 함수를 호출하게 되면, 블록 내 모든 스레드가 해당 함수에 도달하기까지 대기해야 하고 그러면 뒤에 더 이상의 동작이 없는 Warp들이라 하더라고 해당 함수에서 대기하고 있는 상태여야 할거 같습니다.따라서 그러면 해당 warp는 다른 warp들이 동작을 마칠때까지 기다리게 되어 리소스를 반환하거나 하는 동작이 없을거 같은데 왜이렇게 성능이 향상되는지 궁금합니다.
-
미해결홍정모의 따라하며 배우는 C언어
버퍼 지우기에 대해 질문있습니다
8강부터 계속해서 입력한 값이 버퍼에 들어가있을때 원활한 루프 반복을 위해 버퍼에 들어가있는 값들을 비워내는 과정을 하는 것을 배웠습니다.while (getchar() != '\n')continue;근데 맨처음에 scanf와 printf, 그리고 while에 대해 배웠을때는 왜 위의 단계를 거치지 않았는데도 반복이 됐던거죠?int c=0;while(1){ scanf("%d", &c); printf("%d",c); } 이런 것들은 왜 버퍼를 비우지 않았는데도 반복이 되나요, 위의 예시와는 달리 얘는 입력받은 것도 c고 출력하는 것도 c니까 버퍼에 있는게 남김없이(엔터까지) 모두 출력되어서 그런건가요
-
미해결홍정모의 따라하며 배우는 C언어
main.o 파일을 생성하고 또 실행파일을 만드는 이유가 궁금합니다
main.c파일을 컴파일 해서 main.exe 파일이 만들어졌는데 이후에 main.o파일을 만들고 나서 왜 main.o에 대한 실행파일을 만드는 건지 궁금합니다gcc -c main.c는 컴파일만 하고 실행파일은 생성이 안 되니까 실행파일을 더 만드는 것까진 알겠는데 왜 obj파일을 또 컴파일 해서 obj파일로 실행파일을 만드는지가 궁금합니다main.c를 컴파일 => main.exemain.c의 obj 파일 생성 => main.omain.o를 컴파일 => exe_from_obj.exe이 중에 1,2번만 해도 obj파일과 exe파일이 생성된 것이니 더 생성해야될 파일이 없는 것이 아닌가요...?
-
미해결홍정모의 따라하며 배우는 C언어
재귀호출 질문입니다
n=4가 되었을 때이처럼 함수가 중첩된 상태라고 저는 이해했고, n=4가 되어 if문에 들어가지 않게 되자 원래 myfunc함수에서 if(n < 4)//stop condition my_func(n + 1); printf("Level %d, address of variable n = %p\n", n, &n);이 부분에 있는 myfunc때문에 이 밑에 있는 printf("Level %d, address of variable n = %p\n", n, &n); 가 4번 실행 못한 상태가 되었기 때문에 지금 기준 20, 21번 줄을 반복하면서(처음에 중첩되면서 못 돈 부분들을 돌고 있음) myfunc함수가 myfunc안에 없었다면 이런일도 없었겠지만 안에 있는 myfunc함수 때문에 출력이 못된 부분들이 마지막에 순차적으로 나오는 것이라고 이해하면 될까요?
-
미해결홍정모의 따라하며 배우는 C언어
조건문에 c == 'a' 대신에, c == 'a' | 'A' 를 하면 에러가 발생합니다
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int printfMenu() { printf("Enter the letter of your choice:\n"); printf("a. avengers "); printf("b. beep\n"); printf("c. count "); printf("d. quit\n"); } int selectA() { printf("Avengers assemble!\n"); } int selectB() { printf("\a"); } int selectC(){ int n; printf("Enter an integer:\n"); scanf("%d", &n); for (int i = 1; i <= n; i++) { printf("%d\n", i); } } int clearBuffer() { while (getchar() != '\n') continue; } int main() { char c; while (1) { printfMenu(); c = getchar(); printf("%c", c); if (c == 'a'|'A') { selectA(); } else if (c == 'b'|'B') { selectB(); } else if (c == 'c'|'C') { selectC(); } else if (c == 'd'|'D') { break; } else { printf("Wrong input. try again.\n"); } clearBuffer(); } return 0; }강의 전에 혼자 만들어본 코드인데요. 그 전에는 모든게 정상작동되었는데, 기존의 " if(c == 소문자알파벳)" 에서 " if(c == 소문자 | 대문자 )" 로 변경하면 scanf에 무엇을 입력하던지 if (c == 'a'|'A') 가 true가 되어 실행됩니다. c에 입력이 잘못들어가는지 F10으로 확인해보려고 printf("%c", c); 코드도 추가해서 찍어봤는데, c = 'B' 처럼 변수에 제대로 저장되어도, 조건문 if (c == 'a' | 'A')가 실행되네요. 제가 무엇을 잘못한건가요?? 어떻게 고칠수 있을까요 ?? 답변 부탁드리겠습니다 !
-
미해결홍정모의 따라하며 배우는 C언어
8.8 질문있습니다
밑 부분 getfirstchar 함수부분 질문입니다.while((ch = getchar()) != '\n') continue; ch = getchar(); while (getchar() != '\n') continue;윗 부분이 제가 한 것이고 밑 부분이 정답인데 제 것을 복사해서 정답예제에 바꿔 넣어서 하니 넘어가지 않고 try again부분이 계속 반복됩니다이 부분이 문제가 있는건 맞는데 왜 문제가 생기는지 정확하게 모르겠어요 ㅜㅜ
-
미해결문제로 배우는 C언어
질문 있습니다.
Compilation results...--------- Errors: 0- Warnings: 0- Output Filename: C:\Users\Desktop\AA\AA1.exe- Output Size: 127.9296875 KiB- Compilation Time: 1.45s결과 값이 이렇게 나오면 무슨 문제가 있는 걸까요...?
-
해결됨CUDA 프로그래밍 (5) - C/C++/GPU 병렬 컴퓨팅 - 아토믹 연산 atomic op
28-4 shuffle shared - shared memory 강의에서 질문이 있습니다.
안녕하세요. 강의 정말 너무 잘 보고 있습니다!! 다름이 아니라 28-4 강의를 보다 궁금하게 있어서 질문을 드립니다.even odd방식이 Half and Half 알고리즘보다 느린 이유Global Memory에서 Half and Half가 even odd보다 더 느린 이유위 두 가지 이유에 대해서는 이해가 되었지만, Shared Memory를 사용하는 부분에서 이해가 잘되지 않는 부분이 있습니다. Global Memory에서는 Memory Coalescing이 중요하기 때문에 Half and Half가 더 느린게 맞지만, Shared Memory를 사용하는 부분에서는 두 방식(even odd, Half and Half)에서 차이가 없지 않을까 하고 생각했습니다. 두 방식 모두 Global Memory에 접근하고 Write하는 로직은 같기 때문에 Shared Memory에서 성능을 저해하는 요소로는 Bank Conflict만 있다고 생각했는데, 제가 잘못 이해 하고 있는 걸까요??
-
미해결홍정모의 따라하며 배우는 C언어
질문 두 가지가 있습니다
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void display(char cr, int lines, int width); int main() { char c; int rows, cols; // 종료를 깔끔하게 하지 못한다 // while(1) // { // scanf("%c %d %d", &c, &rows, &cols); // while(getchar() != '\n') continue; // display(c, rows, cols); // } printf("input one char and two int :\n"); while ((c = getchar()) != '\n') { scanf("%d %d", &rows, &cols); display(c, rows, cols); printf("input another character and two int : \n"); printf("press enter to quit.\n"); } return 0; } void display(char cr, int lines, int width) { for(int i = 0; i < lines; i++) { for(int j = 0; j < width; j++) { printf("%c",cr); } printf("\n"); } }첫 번째는 강의 5분쯤 밑에 코드로 내려와서 실행하시는데 처음에 * 3 5엔터 후 종료되는 것이 아닌 % 2 2를 이어서 하시는데 제 딴에는 똑같이 따라한 것 같은데 첫번째 엔터 후 종료가 되버립니다.두 번째는 밑에 display함수에서 저는 printf를 사용했고 선생님은 putchar을 사용하셨는데 제 생각에는 별다른 차이가 없을 것 같고 첫 번째 문제를 만나기 전까지는 결과가 이상이 없어 괜찮을 거 같은데 혹시나 해서 그냥 짧게 쓰고자 하는 목적인지 질문합니다
-
미해결
dev c++ 컴파일이 안 됩니다.
dev c++ 설치 이후, Run을 클릭하면 컴파일이 되어야 하는데, source file not compiled가 뜨면서 아예 컴파일 실행이 되지 않습니다. 보통 밑에 컴파일 창이 떠야 하는데, 문서로 저장만 되고 그 이상은 안 되네요. 교수님 말씀으로는 노트북 안의 특정 파일에 제약이 걸려있어서 그렇다고 하시는데... 혹시 해결 방법 있으면 알 수 있을까요?
-
미해결홍정모의 따라하며 배우는 C언어
제가 짜본 코드로는 잘 안 나오는데 왜일까요
printf("Enter some text: "); while ((c = getchar()) != STOP) { n_char += 1; if ((c = getchar()) == ' ') n_word += 1; if ((c = getchar()) == '\n') n_line += 1; } printf("characters=%d, words=%d, lines=%d\n", n_char, n_word, n_line);디버깅을 찍어보는데 디버깅 과정 자체가 이해가 어려워서 어디가 문제인지 모르겠더라고요.빈칸이나 엔터가 있을 때마다 word와 line을 카운팅을 늘려주려고 했는데 출력값은 되게 다르더라고요. 마침표도 여러번 찍어야 루프에서 탈출하고뭐가 어떻게 문제인지 모르겠습니다