묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
미해결홍정모의 따라하며 배우는 C언어
예제 풀이 이렇게 하면 틀린 건가요?
while문을 한번만 써서int main(){ const int secret_code = 337; int guess = 0; while (guess != secret_code) { printf("Enter secret code :"); scanf("%d", &guess); } printf("Great!"); return 0;} 이렇게 쓰니까 결과는 잘 나오던데 틀린 방법인가요?아니면 for문으로int main(){ for (int code = 0;code != 337;printf("Enter secret code :"), scanf("%d", &code)) ; printf("Great!"); return 0;} 이렇게 하는 것도 안되나요?? 잘 돌아가긴 해서 질문 남깁니다!
-
해결됨CUDA 프로그래밍 (2) - C/C++/GPU 병렬 컴퓨팅 - 벡터 vector 더하기
VS2022 컴파일 에러
예제소스코드12a-vecadd-host.cpp -> vecadd-host.cpp 로 파일명 고치고 common.cpp 랑 2개를 쿠다 프로젝트에 추가해서 컴파일 했는데 링크에러가 납니다.vecadd-host.obj : error LNK2005: "float __cdecl getRMS(float const ,float const ,int,bool)" (?getRMS@@YAMPEBM0H_N@Z) already defined in common.obj파일은 저 2개 뿐인데already defined in common.obj 이런 에러가 여러 개가 뜨는데 뭐 때문일까요?
-
미해결홍정모의 따라하며 배우는 C언어
5.5 나누기 연산자
안녕하세요. 강의 뒷 부분의 설명을 듣고 자료형이 다른 것끼리는 곱셈이나 나눗셈을 할 수 없지만 컴파일러가 내부에서 자료형을 맞추어주어 제대로 연산 결과가 출력된다고 이해했습니다.그래서 printf("%f\n", 9.0 / 4); 를 하였을 때 4라는 int형이 double로 변환되어 2.250000이라는 결과가 출력됩니다.그런데 printf("%d\n", 9.0 / 4); 로 하여 출력해보니 0이라는 결과가 나옵니다. 설명대로라면 %d로 바꾸었을 때 2가 출력되어야 하는것이 아닌가요??
-
미해결홍정모의 따라하며 배우는 C언어
13.6 파일 임의 접근
이번 강의 부분에서cur =ftell(fp); 부분에서 자꾸 Breakpoint Instruction Executed라고 뜨면서 오류가 납니다. 아래 결과창을 보면 fp에 null값이 들어간다고 나오는데 어떻게 해결해야 할까요?
-
미해결홍정모의 따라하며 배우는 C언어
4.2 sizeof 연산자
강의 마지막에 구조체를 활용한 크기 계산에 대해서 설명해주신 부분에 대해서 궁금한 점이 생겨서 질문 남깁니다.이렇게 하면,콘솔창에서 8이 출력됩니다.다른 자료형도 잘 되는지 궁금해서 float형을 double형으로 바꾸었더니 결과가 16이 나옵니다. double 형은 8bytes이고 int형은 4bytes이니까 12bytes가 나와야 하는 것이 아닌가요??
-
해결됨Windows 시스템 프로그래밍 - 기본
본 강의를 통해서 얻어갈 수 있는 지식
C#을 통해 WinAPI, DLLImport를 통해 타사 어플리케이션을 조작하고 내용을 얻어오는 프로그램을 만들고 있습니다. 개발을 하면서 각종 오류 (SystemMemoryViolation 등)을 만나는 등 MSDN에서 읽는 것만으로는 해결이 안되고 벽을 느끼는 경우가 있는데 이 강의를 들으면 제가 만들려는 프로그램을 만드는 데 도움이 될까요? 도움이 안되더라도 어쨌든 컴퓨터 분야에서 많은 걸 넓게 알고 싶기에 계속 강의를 볼 계획이긴 합니다.
-
미해결홍정모의 따라하며 배우는 C언어
2.9 함수 만들기 void 질문
2.9 함수 만들기에서 선생님이 이렇게 입력하셨는데요 왜 void를 써야 하는지, void 함수의 역할이 자세하게 궁금합니다. 그리고 아래 괄호 사이에 printf("Hello, World!\n"); 를 왜 입력해야 하는지 모르겠습니다.
-
미해결홍정모의 따라하며 배우는 C언어
fgets로 입력받은 문자열에 남는 부분
강의 14:30 코드를 치고 디버거로 확인해봤는데교수님의 경우 hello다음 \n이 있고나머지는 다 \0로 채워져있는데'?'가 채워져있네요. 왜 이럴까요?gets()함수로 문자열을 입력받은 후 배열의 나머지 자리에는 '\0'으로 채워지나요?또 gets()말고 scanf()든 fgets()도 '\0'로 채워지나요?scanf(),fgets()도 디버거로 확인해보면 다 '?'로 뜨네요.
-
미해결홍정모의 따라하며 배우는 C언어
13:44 질문 있습니다
float arr2d[2][4] = { {1.0f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} }; float(*pa)[4]; float* ap[2]; pa = arr2d; ap[0] = arr2d[0]; ap[1] = arr2d[1]; printf("%p %p\n", ap, (ap + 1));이 부분에서 출력이 ap변수 본인의 주소가 출력되는건 이해 했습니다 . int arr[2][3] = { {1,2,3},{4,5,6} }; int* parr[2]; parr[0] = arr[0]; parr[1] = arr[1]; for (int j = 0; j < 2; ++j) { for (int i = 0; i < 3; ++i) printf("%d %d %d %d\n", arr[j][i], parr[j][i], *(parr[j] + i), *(*(parr + j) + i)); printf("\n"); }이 코드는 10.13강의 13:16초 부분에서 가져온 코드인데요 . 궁금한게 이중포문 안쪽 부분에서 *(*(parr + j) + i) <-- 얘가 계산될때 괄호에 의해서 (parr + j) 가 먼저 연산이 되잖아요 ?? 그러면 이때도 parr 본인의 주소값에 j가 더해져서 엉뚱한값이 나와야 할텐데 , 정상적으로 출력이 되어서 위에 ap변수가 본인의 주소값을 출력할때랑 어떤부분이 다른지 궁금합니다 ...
-
미해결홍정모의 따라하며 배우는 C언어
2차원배열이 함수에 들어왔을때
#include <stdio.h> #define ROWS 3 #define COLS 4 int sum2d_3(int* arr, int rows, int cols); int main() { int data[ROWS][COLS] = { {1,2,3,4},{5,6,7,8},{9,0,1,2} }; return 0; } int sum2d_3(int *arr, int rows, int cols) { int r, c, tot = 0; for (r = 0; r < rows; r++) for (c = 0; c < cols; c++) tot += *(arr + c + cols * r); return tot; }여기서 data는 포인터 연산시 자료형이 int(*)[4] 주소자료형입니다.2차원 배열 data를 함수의 안에 넣고 매개변수 int *arr로 사용할때 tot += *(arr + c + cols * r); 를 보면 마치 배열 arr가 1차원 배열인것처럼 사용되고 있습니다. Q.2차원 배열은 함수안에 들어가면 1차원배열처럼 포인터 연산이 되는건가요? 감사합니다.
-
해결됨독하게 되새기는 C 프로그래밍
높은 메모리 위치의 쓰기 요청이 더 오래 걸린다는 설명이 이해가 가지않습니다.
안녕하세요. 강의 잘 듣고 있습니다. 강의를 보다가 이해되지않는 부분이 생겨 질문 드립니다. 하드디스크에 쓰기요청을 할 때 SSD는 HDD와 달리 물리적 장치를 사용하지 않기때문에 메모리 위치에 상관없이 빠르게 접근할 수 있는 것으로 알고있습니다. 그래서 1번 위치(995MB)에 접근해서 4byte를 쓰는 것과 1번 위치(100MB)위치에 4byte를 쓰는 것이 별로 차이 나지 않을 것이라 생각하는데요.HDD도 디스크의 외곽에 위치한 곳에 접근하는 것이 가장 오래걸린다고 알고 있습니다. 하지만 디스크 외곽에 위치한 곳이 항상 높은 메모리 위치(995MB)는 아닌 것으로 알고 있습니다.또한 공간확보라는 말씀이 잘 이해가 가질 않네요. 995MB의 위치에 4byte를 쓰는데 왜 995MB의 공간확보가 필요한 것인가요?? 파일이 0~1GB까지 연속적으로 메모리 할당을 해야하는 것인가요? 띄엄띄엄 메모리 할당을 하면 안되는 것일까요?
-
미해결홍정모의 따라하며 배우는 C언어
int (*pa)[4]와 int*pa의 차이
#include <stdio.h> int main() { float arr2d[2][4] = { {1.0f,2.0f,3.0f,4.0f},{5.0f,6.0f,7.0f,8.0f} }; float(*pa)[4] = arr2d; printf("%u %u \n", (unsigned)pa, (unsigned)(pa + 1)); printf("%u %u\n", (unsigned)arr2d[0], (unsigned)arr2d[1]); printf("%u %u\n", (unsigned)pa[0], (unsigned)(pa[0] + 1)); printf("%f\n", pa[0][0]); printf("%f\n", *pa[0]); printf("%f\n", **pa); printf("%f\n", pa[1][3]); printf("%f\n", *(*(pa + 1) + 3)); float* ptr = arr2d; printf("%u %u \n", (unsigned)ptr, (unsigned)(ptr + 1)); printf("%u %u\n", (unsigned)arr2d[0], (unsigned)arr2d[1]); printf("%u %u\n", (unsigned)ptr[0], (unsigned)(ptr[0] + 1)); printf("%f\n", ptr[0][0]); printf("%f\n", *ptr[0]); printf("%f\n", **ptr); printf("%f\n", ptr[1][3]); printf("%f\n", *(*(ptr + 1) + 3)); }강의 9:47에서 int(*pa)[4]가 나옵니다.강의 10:20에서 교수님께서 pa는 4개의 float자료형을 가진 배열에 대한 포인터라고 하셨습니다.저는 이것을 [4개의 float자료형을 가진 배열]의 배열에 대한 즉, 2차원배열에 대한 포인터라고 이해했습니다.float arr[4] = { 1.0f,2.0f,3.0f, 4.0f }; float(*pa)[4] = arr;Q1. 위처럼 (*pa)[4]에 1차원 배열도 넣을수 있는건가요? float(*pa)[4]에서 [4]가 헷갈리는것같습니다. 정확히 정의를 내리기가 힘듭니다. float(*pa)[4]란 무엇인가요?ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡpa는 어쨋든 그냥 단순한 포인터 변수 하나 라고 이해했습니다.그래서 똑같이float* ptr = arr2d; 포인터 변수를 하나 선언하고 거기에 2차원 배열([4개의 float자료형을 가진 배열]의 배열을 넣어줬습니다.저는 pa랑 ptr은 그냥 외형만 다를뿐 문법적으로 같은 포인터변수라고 이해했습니다.그런데 pa같은 경우printf("%f\n", pa[0][0]); printf("%f\n", *pa[0]); printf("%f\n", **pa); printf("%f\n", pa[1][3]); printf("%f\n", *(*(pa + 1) + 3));이중포인터처럼 사용가능한 반면ptr의 경우는printf("%f\n", ptr[0][0]); printf("%f\n", *ptr[0]); printf("%f\n", **ptr); printf("%f\n", ptr[1][3]); printf("%f\n", *(*(ptr + 1) + 3));이중포인터처럼 사용하면 밑줄이 뜨고 오류가 떳습니다.그림을 그려보니 ptr은 당연히 단순 포인터변수이기에 이중포인터처럼 사용은 불가능했습니다. Q2.그렇다면 어째서 pa는 포인터변수인데도 이중포인터처럼 사용이 가능한건가요? 또 pa와 ptr의 차이는 무엇인가요? 항상 감사합니다. 진짜 진짜 진짜 감사합니다.
-
해결됨IT 기업 취업을 위한: 코딩테스트 혼자서 정복하기 (C/C++)
f20 에서 f15 + 1은 이해가 됩니다...
다만, f15 에서 f10 +1 +1 / f12 +1 +1 은 이해가 되지 않습니다. 15원을 만들기 위해서는 10원을 만든 동전 개수에서 5원짜리 동전+1 만 하는게 맞지 않나요? 마찬가지로 f12도 12원을 만들기 위해서는 12원을 만든 동전개수에 3원짜리 +1만 하면 되는줄 알았지만 왜 f10 +1+1 / f12+1+1 인지 이해가 되지않습니다...
-
미해결홍정모의 따라하며 배우는 C언어
2차원 배열에서의 주소
#include <stdio.h> int main() { int arr[2][3] = { {1,2,3}, {4,5,6} }; printf("%u %u %u %u %u", arr+1 ,arr[1], &arr[1], &arr[0]+1, arr[0] + 1); return 0; }강의 4:50 화면을 보면서 궁금한게 있습니다.arr == arr[0] == &arr[0]이고arr+1 = &arr[1] == &arr[0]+1이므로arr[0]+1또한 arr+1 = &arr[1] == &arr[0]+1과 같은 주소값을 출력할거라 생각했는데 arr[0]+1을 출력하니 &arr[0][1]이 출력되었습니다.Q1. 그 이유가 무엇인가요?강의 3:18에서 arr[0]가 두번째 인덱스가 붙는 배열의 이름이라고 하셨는데 그러므로 arr[0]는 {1,2,3}의 첫번째 원소의 주소를 가리키는 포인터가 되고 arr[0] +1은 포인터연산에 의해 데이터 2의 주소를 가리키는 포인터가 되는건가요? 제가 제대로 이해한게 맞을까요?Q2. 그렇다면 2차원 배열 arr[2][3] = {{1,2,3},{4,5,6}}에서arr은 {{1,2,3},{4,5,6}}의 첫번째 원소{1,2,3}의 주소를 가리키는 포인터인데 첫번째 원소가 {1,2,3}이므로 이중포인터가 되는것이고, arr[0]는 {1,2,3}의 첫번째 원소의 주소를 가리키는 포인터가 맞나요?굉장히 헷갈리고 어지럽네요...감사합니다.
-
미해결홍정모의 따라하며 배우는 C언어
16진수에 대한 설명
<3.8 8진수와 16진수>강의에서 16진수에 대해 설명하시면서unsigned int의 최댓값을 각각 10진수, 2진수, 8진수, 16진수로 나타내주셨습니다.16진수의 표현에서 f가 8개인 이유는 16이 2의 4제곱이기 때문이라고 하셨는데 해당 설명의 메커니즘이 잘 이해가 되지 않아 질문드립니다.수강 후 공부해본 결과, 2진수 1111이 16진수에서 f 하나에 해당하기 때문에, 해당 unsigned int의 최댓값인 2진수의 32비트는 나누기 4를 하여 16진수에서 8자리가 나타난다는 것은 이해를 하였습니다.그러나 16이 2의 4제곱이라서 8개의 자리만 있으면 된다는 설명에 대해선 이해가 어려워 조금 더 구체적으로 알려주시면 감사하겠습니다.
-
해결됨홍정모의 따라하며 배우는 C언어
왜 int, long, long long 타입의 변수에 최솟값을 할당하면 언더플로우가 아니고 에러가 발생하나요?
오버플로우를 확인해보고 언더플로우도 확인해보려고 최솟값을 할당한 후 값에 -1을 할 계획이었습니다.그런데 최솟값을 할당하는 것 자체가 에러가 발생했습니다.에러는 error C4146로https://learn.microsoft.com/ko-kr/cpp/error-messages/compiler-warnings/compiler-warning-level-2-c4146?view=msvc-170위의 사이트에서 설명을 참고했습니다.그런데 위 사이트의 설명에 의한다면 char과 short도 최솟값이 할당이 안되고 에러가 나야할 것 같은데 char과 short는 최솟값도 할당이 잘 되고, 최솟값에 -1을 했을 때 언더플로우도 잘 발생(?)되었습니다.혹시 왜 그런것인지 알려주실 수 있으실까요..?!
-
미해결홍정모의 따라하며 배우는 C언어
gcc main.c 컴파일 안됨
아예 다 지우고 다시 해봤는데도 gcc main.c 를 쳐도 오류만 뜹니다. shell창이 저는 cmd로 되어있는 것과는 관련이 없을까요? F1을 쳐서 shell을 쳐보았는데 강의에 나오는 것처럼 shell 종류를 바꿀 수 있는 것이 저는 뜨지 않더라고요. 전에 파이썬 배울 때 설정해 두었던 것이라서 어떻게 했는지 잘 기억이 안나요. 저것도 powershell로 바꾸는 방법도 알려주시면 감사할 것 같습니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
임계영역 기반 동기화 질문입니다.
안녕하세요. 시스템 프로그래밍 수업을 듣고 있는 수강생입니다. "임계영역 기반 동기화" 에서 질문이 있습니다. 해당 예제 코드는 ThreadFunc1과 ThreadFunc2가 경쟁적으로 SetString, GetString 하는 것을 CRITICAL_SECTION 으로 해결해보려는 예제로 인지했습니다. 그런데 main함수 초반에 hHandle에 ThreadFunc1쓰레드를 실행(_beginthreadex)하고 ::CloseHandle(hThread);를 했습니다. 저는 그래서 ThreadFunc1쓰레드가 종료되었다 생각하여 ThreadFunc1을 출력할 일이 없을거라 생각했습니다.하지만 실행결과는 ThreadFunc1과 ThreadFunc2이 랜덤으로 5번 출력되는데 왜 ThreadFunc1이 출력되는지 궁금합니다. 혹시 제가 간과한 개념이 있을까요??
-
미해결홍정모의 따라하며 배우는 C언어
1.13 비주얼 스튜디오 코드의 기본적인 사용 방법 5분 48초쯤
선생님 따라서 .\a.exe를 쳤는데 왜 오류가 뜨는건지 모르겠어요
-
미해결홍정모의 따라하며 배우는 C언어
1.11 명령 프롬포트의 기본적인 사용법 2분 42초쯤
선생님이 보여주신 명령 프롬포트 화면이랑 제 노트북에 뜨는거랑 달라서요. explorer를 어디다가 붙여야 하는지 모르겠습니다.. 알려주세요