묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 시작하는 C 프로그래밍
[섹션10 연산자] 필수 실습 문제 합격, 불합격 판단하기
안녕하세요 강사님[섹션10 연산자] 필수 실습 문제 합격, 불합격 판단하기 문제 질문드립니다. 강사님께서는 printf 함수안에 조건(3항)연산자를 넣으셨는데요저는 nSelect이라는 문자열을 선언해서 nSelect에 합격, 불합격이라는 문자열을 저장해서 printf로 출력하는 방식으로 문제를 풀어봤습니다 nSelect이라는 변수에 문자열의 공간!?을 10byte로 선언하고 0으로 초기화 한뒤에 실행을 했더니 실행은 잘 되는데 nSelect이라는 변수에 빨간색 밑줄과 오류 코드가 L-value로 뜨더라구요 왼쪽 피연산자를 변수인 nSelect으로 선언했는데 오류코드가 왜 뜨는건지 모르겠고 오류코드가 뜨는 왜 점수를 80으로 입력하면 '합격', 70으로 입력하면 '불합격'이라고 실행이 잘되는데 왜 그런지 이유가 궁금합니다. 문제가 없는건가요? 일부러 오류를 내보려고 nSelect이라는 변수에 문자열의 공간!?을 1byte로 선언하고 0으로 초기화 한뒤에 실행을 했더니 일단 실행은 잘됩니다. "합격"이라는 글자는 한글이므로 한글자 당 2byte 총 4byte의 크기이고 "불합격"이라는 글자는 3*2 = 6byte라서 nSelect라고 선언한 문자열 변수에 공간에 없어서 실행조차 되지 않아야하는데 실행이 됩니다. 왜 실행이 되는 것일까요? 물론 하단 오류 목록에 '배열의 크기가 0보다 커야합니다.' '상수크기의 0 배열을 할당할 수 없습니다'라는 설명이 있긴하지만 실행은 되어서 의문입니다. 또한 8번째 코드의 L-vaule 오류는 여전히 나옵니다.nSelect 문자열의 크기 선언을 1byte로 하면 역시 실행은 잘되는데 여전히 L-value 오류 항목이 뜹니다 선언한 배열의 크기가 1byte인데 그보다 크기가 큰 "합격", "불합격"이 문자열에 대입되고 실행이 됩니다. 이유가 궁금합니다
-
해결됨독하게 시작하는 C 프로그래밍
포인터와 배열의 이름의 차이가 궁금합니다.
상수 포인터와 배열의 이름은 유사한 개념이라고 파악하고 있었는데, sizeof(배열의 이름)은 배열의 크기를 출력해준다는 점에서 약간의 차이가 있다는 점을 알게 되었습니다.또한, 참조 연산자를 통한 결과 또한 포인터의 경우, 메모리를 확인한 결과 해당 주솟값을 가리키고 있는 다른 주소의 값을 가지고 있었지만, 배열의 이름은 동일한 주솟값이 결과로 나오는 것을 확인할 수 있었습니다.제가 이해한 바로는 배열의 이름 자체는 배열의 시작 주소이기에 'test2' 는 'H'라는 배열의 시작 주소를 가리키고, '&test2'는 "Hello World"라는 배열 자체 주소를 가리키는 것이라고 판단을 했는데, 이것이 맞는 이해인지 궁금합니다.두 개념이 비슷하지만 약간의 차이가 있는 것 같은데 이 차이에 대해서 설명해주시면 감사하겠습니다.
-
해결됨독하게 시작하는 C 프로그래밍
배열강의에서 l-value r-value 관련 궁금한 점이 있습니다.
안녕하세요강의 감사히 잘 공부하고 있습니다. 배열 강의에서 배열의 이름 int a[4]; 같은 경우 a이 상수와 같은 r value 에 속한다고 하셨는데, 배열 이름은 메모리 상의 데이터 구조를 식별하는 역할을 하며 이는 주소의 불변성과 관련이 있기 때문에 l-value로서 값이 변경되지 않는 특수한 형태로 보는 것이 더 맞지 않나요?
-
해결됨독하게 시작하는 C 프로그래밍
간접 지정 증감 연산 질문 있습니다.
pszData의 총 5가 증가했고 (인덱스가 5개 증가) int형으로 바꾸었기 때문에 주소의 값이 5가 아닌 20이 증가한 것을 확인했습니다.근데 Length의 값이 5가 나오는 것은 어떤 이유 때문인지 정확하게 이해가 안됩니다. 배열의 식별자는 주소 상수이기 때문에 20이 나와야 되는게 아닌가 라고 생각했습니다. 왜 5가 나오는지 잘 모르겠습니다. pszData가 szBuffer와 5만큼 떨어져 있기 때문에 5가 나온 것입니까? 메모리에는 pszData와 szBuffer가 주소 상수값을 가지고 있고 연산한 것처럼 보이는데 왜 5가 나올까요...
-
해결됨CUDA 프로그래밍 (3) - C/C++/GPU 병렬 컴퓨팅 - 메모리 구조
계산시간 비교
알찬 강의 계속 잘 듣고 있습니다!CPU와 GPU version의 계산시간 비교에 대해 질문 드립니다. 커널에서 계산시간만 비교하면 CUDA이 훨씬 빠릅니다. CPU version (filter-host.cu): 44,784 usCUDA version (filter-dev.cu): 830 us하지만 CUDA version에서 메모리 복사를 포함하면 337,737 us 으로 CPU version보다 훨씬 느린 것 같습니다. 혹시 메모리 복사 시간을 줄이는 방법이 있는지요?
-
해결됨독하게 시작하는 C 프로그래밍
달팽이 문제] 설명을 듣지 않고 구현을 해봤습니다.
도전정신 때문에 설명 듣기 전에 구현을 했더니 강사님 의도와 다르게 구현되었지만.... 1시간 헤딩한 시간이 아까워서 남겨둡니다아~~두 가지 접근방법이 생각났는데, 그 중 하나는 이동 불가능할때마다 이동 방향을 바꾼다는 간단한 논리로 위 코드로 구현해봤고,두 번째로 생각난 접근방법은 위 그림처럼 블럭이 5, 4, 4, 3, 3, 2, 2, 1, 1 순으로 첫번째를 제외한 블럭 수가 2개씩 묶인다는 점이 생각났는데, 첫 번째 블록이 규칙에 살짝 어긋난다는 점에서 구현이 복잡해질 것 같아서 포기했습니다. 설명해주신 방법대로 위 그림에서의 블럭이 2개 합쳐진 채로 규칙을 찾았으면 간단하게 구현 가능했을 것 같습니다.설명해주신 방법으로도 구현을 해봐야겠네요..
-
해결됨독하게 시작하는 C 프로그래밍
숙제해왔습니다
25번 반복에 끝낸다는 방향을 잡고 시작했습니다.9, 7, 5, 3, 15/4, 4/3, 3/2, 2/1/ 1/0+/+, -/-, +/+, -/-, +/+그리고 행 증가, 열 증가인지 파악한 후에 코딩했습니다.다른 모범 답안 보니까 저랑 달라서 자신감이 뚝 떨어졌습니다.제가 생각해낸 패턴을 코드로 하나도 구현하지 못한거 같아요 예제 코드보니까... 예제 코드 보면서 현타 많이 왔는데 다시 처음부터 한다고 생각하고 코드짜보겠습니다.
-
미해결홍정모의 따라하며 배우는 C언어
이중포인터
char* arr[] = { "Cherry", "AppleBee", "Pineapple", "Apple", "Orange" }; 인 상태입니다. 이때 swap함수는 void swap(char** a, char** b) { int temp = *a; *a = *b; *b = temp; } 이고 swap(&arr[i], &arr[min_idx]);를 했을 때 두 주소값이 바뀌는 걸 알 수 있습니다. 그런데 이때 파라미터가 이중포인터인 이유가 조금 햇갈립니다. swap함수에 있는 파라미터 a와 b는 그 함수에서만 작동하는 게 아니라 직접 arr함수의 메모리에 작동해야되기 때문에 포인터를 쓰는 것이잖아요? 이떄 a와 b는 각각 그 주소의 포인터가 될 것인데 이때 그냥 포인터가 아니라 이중포인터가 붙는 이유는 arr 자체가 포인터의 배열로서 이중포인터니까 접근하려면 이중포인터 표시를 해야된다라고 생각하면 될까요? (이정도만 생각하면 되는 건지 고민이네요) 만약 그렇다면 이때 a와 b에 디퍼런싱을 한 번만 해서 값을 바꾸는 이유는 우리가 바꾸려는 건 주소값이지 글자 하나를 바꾸는 게 아니기 떄문이다 라고 생각하면 될까요?
-
미해결홍정모의 따라하며 배우는 C언어
포인터에 [ ]을 붙이는건 새로운 문법인가요??
ptr[k]부분이 이해가 가질 않아서요...다른 분들이 올린 질문도 봤는데 2차원 배열도 결국엔 1차원으로 정렬된 메모리라는건 어느정도 이해가 된 것 같은데...포인터 옆에 [ ]를 붙이는 것이 간접 참조 연산자랑 같은 기능을 하는건지 궁금합니다..
-
해결됨독하게 시작하는 C 프로그래밍
quick sort 부분 구현했습니다.
pivot이 되는 5보다 큰 값은 오른쪽의 작은 값과 교환하면서 마지막에는 pivot의 위치도 바꾸어 주었습니다. 이후 코드를 작성한다면 pivot의 값을 다시 0과 high+1로 또 for문을 작성해야 하는데 코드가 무자비하게 길어집니다. 솔직하게 for문 안에서 모든걸 끝내기에는 제가 너무 부족한거같습니다. 이후 배우는 함수에 피벗이나 리스크 길이 등 매개변수로 받아서 리스트 길이가 0이나 1이 될때까지 반복하고 값을 교환해주는 것도 함수로 만들어서 처리하면 좋을 것 같습니다. 코드가 복잡해질수록 너무 어렵네요. 이정도 구현한것으로 만족하겠습니다
-
해결됨독하게 시작하는 C 프로그래밍
선택정렬 if 교환
소스코드 18라인에 if로 j가 변환할떄만 바꿔주신다고 했는데 변환하지 않아도 자기자신끼리 교환하는 거니까 결과값이 달라지진 않잖아요. 근데도 조건문을 사용하는게 더 좋은 코드인건가요?
-
해결됨독하게 시작하는 C 프로그래밍
질문
수업듣다가 말씀하신 부분중에 궁금한부분이 있어서요.혹시 스태틱바인딩, 다이나믹 바인딩 관해서 더 알아보고 싶은데, 설명을 어디강의에서 들을 수 있나요 ~~~?????
-
해결됨홍정모의 따라하며 배우는 C언어
tool() 함수 위치에 따른 에러
안녕하세요,main.c 와 second.c 에서 각각 하기와 같이 적어봤습니다.프로그램을 실행시키면, 하기와 같은 에러가 뜨는데요, undefined warning이 뜨는 이유는 main()함수에서 fun_second()를 실행시, fun_second()로 가서 tool()함수를 실행하려 했으나 전방선언이 되어있는것도 아니고 함수 선언부+몸체가 fun_second() 보다 앞쪽에 정의되있지 않기때문에 tool()함수를 발견할 수 없어 undfined에러가 뜬 것으로 이해했습니다.그런데 redefinition 에러가 뜬건 이해가 잘 되지 않습니다.tool()함수는 fun_second()아래 한번만 정의했는데 어째서 중복 정의라는 에러가 뜬걸까요??수박님 제가 질문한 글에 달아주신 답변 말고도, 다른 질문글에 달아주신 답변들이 독학하는데 정말 큰 도움이 됩니다. 항상 감사합니다.
-
해결됨홍정모의 따라하며 배우는 C언어
int* 만큼 이동한다는 말의 뜻이 궁금합니다.
안녕하세요, 이전 질문글의 답변에서 궁금한 점이 있어 질문드립니다. 링크는 https://www.inflearn.com/course/lecture?courseSlug=following-c&unitId=28273&tab=community&category=questionDetail&q=1142021 이고, 스샷으로 가져왔습니다. 밑줄 친 부분이 이해가 잘 가지 않는데요,arr 배열의 원소타입이 int 이므로 , arr + 1 은 arr[1]을 가리키는 포인터의 위치로 이동한다는 건 잘 알겠습니다. arr, 즉, arr[0]의 주소가 만약 100이면 104 로 이동하겠죠. int 크기가 4바이트니까요.그렇다면, parr + 1도 int* 크기만큼 이동해야 할 것 같은데요, int* 는 주소값을 저장하는 타입이므로 주소값의 크기인 4바이트(혹은 운영체제에 따라 8바이트) 만큼 이동해야 할 것같은데, 하기 첨부한 그림을 보면 parr[0] 시작 주소 부터 parr[1] 시작 주소까지 12바이트를 이동합니다. 직관적으로는 그럴것 같은데 헷갈려서 질문드립니다. 감사합니다.
-
해결됨독하게 시작하는 C 프로그래밍
메모리의 주소가 다르게 출력됩니다.
디버깅 모드로 추적하면서 따라가던 중 콘솔에 출력되는 pszdata의 주소가 &pszdata로 추적하였을 때 나오는 메모리 주소와 다른 값이 출력됩니다 szbuffer는 같은 값이 나왔습니다 .. 왜 그런걸까요 ..??
-
해결됨홍정모의 따라하며 배우는 C언어
* (asterisk) 가 초기화문에서 사용될때, 할당문에서 사용될때 차이.
안녕하세요,초기화문에서 *가 사용될땐 주소가 저장되고,일반 명령문에서 변수앞에 *를 붙이면 앞의 경우와 다르게 redirection 연산자로서 사용되는데 그냥 암기해야 되나요? 간단한 예를 들면, int *a = 0x0077*a = 123;위 두 문장의 의미는 각각 int 포인터 변수 a 를 선언하며 0x0077 이라는 주소값을 a 에 저장. a가 가리키는 주소(0x0077)에 접근하여 123을 저장. 감사합니다.
-
미해결C언어 슈팅게임 따라만들기
mac OS 에서 프로젝트 진행 시 라이브러리 없음
맥 혹은 리눅스에서 프로젝트를 진행하려고하는데 <conio.h><Window.h>등 윈도우에서만 가능한 라이브러리들을 어떻게 하면 좋을까요?다른 방식으로 구현할 수 있는 방법이 있을까요?
-
해결됨Go Hard to C (feat. Algorithm)
stdio.h 파일을 찾을수 없다고 나오네요.
화면과 같이 진행중인 학습자입니다.cmd 에서 stdio.h 파일을 찾을수 없다고 나오는데, 혹시 추가 설치해야 하는 것이 있나요?
-
해결됨홍정모의 따라하며 배우는 C언어
함수 선언부와 정의부가 다른 파일에 있어도 빌드가 되는 원리.
안녕하세요,강의에서main.c 파일 안에 #include "my_print_fucntions.h"를 통해 my_print_functions.h를 main파일에 인클루드해주면, 함수의 선언부만 main.c에 복붙이 됩니다. 선언부는 main.c안에 놓이는거겠죠.그런데 이 때, #include "my_print_fucntions.c" , 함수의 바디가 정의되어있는 my_print_fucntions.c 파일을 main.c 안에서 인클루드해주지 않아도 되는 이유는, 링커가 알아서 함수를 찾아 연결해주기 때문이고, 그렇게 되는 이유는 헤더파일의 함수 선언부에서 extern 키워드가 생략되어있어서 그렇다고 봐도 될까요?( (extern) void print_hello(); 이렇게요.) 감사합니다.
-
해결됨CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기
매크로 함수를 쓴 이유
안녕하세요!좋은 강의 잘 듣고 있습니다.common.cpp 코드 중에서 ELAPSED_TIME_BEGIN(N)과 ELAPSED_TIME_BEGIN(N)을 매크로 함수로 정의한 이유가 무었인지요?CUDA_CHECK_ERROR() 함수는 __FILE__과 __LINE__ 때문에 매크로 함수로 정의하신 걸로 이해합니다만, 시간 측정 함수들을 매크로함수로 정의하신 이유는 잘 이해되지 않습니다.답변 부탁드립니다.감사합니다.