묻고 답해요
156만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 시작하는 C 프로그래밍
완강 후 실습 관련 질문
안녕하세요! 항상 좋은 강의 만들어 주셔서 감사합니다. 이번에 독하게 시작하는 C를 완강하고 자료구조를 듣는 중입니다. 그런데 C언어를 완강해도 능숙하게 다룰 수 있다는 느낌이 들지 않아서 C 코딩 예제를 플어보고 싶은데 혹시 추천해주실 만한 예제 사이트나 교재가 있으신가요?
-
미해결홍정모의 따라하며 배우는 C언어
Stolen 마지막부분 오류 질문입니다
아무리봐도 똑같이 따라쓴것 같지만 오류가 있다고 뜹니다 ㅠㅠ
-
해결됨홍정모의 따라하며 배우는 C언어
mingw-w64 폴더 설치 중 에러
2시간동안 꼼지락 거리다가 이상한 폴더에 mingw-w64가 숨어있는 것을 발견하였습니다!왜인지는 모르겠으나 과거에 C언어 코딩 독학용으로 깔았던 Dev-Cpp(데브씨플플) 폴더 안에 MinGW64라는 이름으로 있는 것 아니겠어요?!그리고 열어본 결과 존재 합디다...그래서 신나서 글을 쓰던 도중 '어? 이거 지우고 다시 깔면 에러가 안 뜨지 않을까?' 해서 지워봤습니다안 되더라구요...다시 방황하던 중 msys2를 설치하라는 답변글을 보고 설치했었던 msys2 폴더에서 자포자기한 심정으로 gcc.exe를 검색해 봤습니다그런데 요녀석이 ucrt64\bin 안에도 숨어있더라구요!그래서 이번에는 실험 그딴거 안하고 바로 연결했습니다
-
해결됨독하게 시작하는 C 프로그래밍
개정판 출판 계획
안녕하세요.개발자는 아니지만 업무 능력 고도화를 위해 강의를 수강하고 있는 직장인입니다. 독하게 시작하는 C프로그래밍 2015년판이 절판되었고, 강의 소개에 최신 개정판을 위한 강의라고 돼 있는데혹시 최신 개정판 출판 계획과 예상 일자가 있는 것인가요?
-
해결됨독하게 시작하는 C 프로그래밍
섹션 14. 사용자 함수 필수 실습 문제
안녕하세요! 여기서 세 정수를 입력받는 함수를 사용자 함수로 만드는 과정에서 어려움이 있습니다.. 입력받는 함수는 main에 넣으면 쉬운데 이렇게 3개 정수를 넣으려니 계속 막혀요ㅠㅠ
-
미해결홍정모의 따라하며 배우는 C언어
3.12 강의 수학적으로 존재하지 않는 식을 강행했을 때
안녕하세요. 비주얼 스튜디오에서 선생님과 똑같이 asinf() 코드를 작성하고 실행을 했는데 선생님 화면에서 나온1.570796-nan(ind)대신에8096.0000008096.000000이렇게 나옵니다. 뭐가 잘못된걸까요?
-
해결됨홍정모의 따라하며 배우는 C언어
11.2강 19:43 질문이 있습니다.
공부한 내용을 테스트해보려고 다음 코드를 작성했습니다.#include <stdio.h> #include <stdlib.h> int var_global_initialized = 1; int var_global_uninitialized; void func_test(); int main(void) { // 값이 저장되는 메모리 영역과 그 주소 // Code 영역 printf("%llu [Code]\n", (unsigned long long)"I am a String."); // Data 영역 printf("%llu [Data]\n", (unsigned long long)&var_global_initialized); // BSS 영역 printf("%llu [BSS]\n", (unsigned long long)&var_global_uninitialized); // Heap 영역 char* var_dynamic = (char*)malloc(sizeof(char) * 100); printf("%llu [Heap]\n", (unsigned long long)var_dynamic); // Stack 영역 func_test(); return 0; } void func_test() { int var_local = 0; printf("%llu [Stack]\n", (unsigned long long)&var_local); }; 메모리 영역 별 간격이 너무 작게 출력되는데 올바르게 작성한게 맞을까요..?? 참조온라인 컴파일러 링크문자열 리터럴이 저장되는 메모리 영역 링크메모리 영역별 예제 코드 링크
-
미해결HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌
서보모터 질문
안녕하세요 강사님! 아래 서보모터 관련 질문을 썼던 학생입니다:) 같은 문제로 여러 번 질문드려 죄송합니다ㅠㅠ강사님께서 말씀 주신대로 pwm 파형을 오실로스코프로 찍어봤는데 동작펄스폭 내에서 제대로 출력되고 있었습니다. 혹시 몰라 버튼을 누를때마다 펄스폭이 바뀌는 프로그램을 넣어서 실험해봤을 때도 펄스가 제대로 출력되고 있었습니다. 서보모터에 들어가는 전원 5v도 제대로 들어가는 것도 확인했는데, 서보모터가 동작하지 않습니다ㅠㅠ 근데 해당 서보모터를 아두이노 예제 프로그램으로 돌려보면 문제없이 돌아갑니다. 무엇이 문제인지 예상되는 원인이 있을까요?? 저는 아무리 생각해봐도 뭐가 문제인지 모르겠습니다ㅠㅠ 모터에 전원과 pwm만 제대로 인가되면 동작하는 것이 아닌가요? 사용하는 서보모터는 영상과 같은 sg90입니다!
-
해결됨독하게 시작하는 C 프로그래밍
메모리 할당 해제 방법에 대한 질문
안녕하세요 수업 잘 듣고 있습니다.malloc함수로 운영체제한테 메모리 공간을 받아온다고 배웠습니다. 이 때는 내가 사용할 메모리 크기을 명시하는데free로 메모리를 해제할 땐 내가 받아온 메모리 크기를 명시하지 않는데 어떻게 컴퓨터는 할당해준 메모리를 정확하게 해제해줄 수 있나요? 따로 어디에 할당해준 메모리 크기를 저장해두는 건가요?
-
해결됨독하게 시작하는 C 프로그래밍
섹션 13 다차원 배열 필수 실습문제
안녕하세요!! 그 섹션 13 다차원 배열 필수 실습 문제에서 이 문제 혹시 답 좀 알 수 있을까요! 최대한 간단한 답을 알고 싶습니다!!
-
미해결홍정모의 따라하며 배우는 C언어
swap 함수에서 printf문 질문있습니다
수업 내용의 프린트 구문은 void swap(int* u, int* v) { printf("%p %p\n", u, v); int temp = *u; *u = *v; *v = temp; } 이런식으로 되어있는데 u와 v에 &기호를 붙혀주면 a, b 와 주소가 다르게 나오는데 어떤 주소인지 잘 모르겠습니다..
-
해결됨홍정모의 따라하며 배우는 C언어
10.14강 11:11 질문이 있습니다.
int(*ptr_arr)[3];위 형태가 int [3] 의 배열을 가리키는 포인터라는 것은 이해했습니다. int arr[3] = { 1, 2, 3 }; int* ptr_arr_1 = arr; printf("%d\n", ptr_arr_1[1]); // 1) int (*ptr_arr_2)[3] = arr; printf("%d\n", ptr_arr_2[0]); // 2) printf("%d\n", ptr_arr_2[0][1]); // 3) printf("%d\n", (*ptr_arr_2)[1]); // 4)1)의 경우 지금까지 써왔기 때문에 왜 arr의 1번째 요소가 나오는지 이해했습니다.2)의 경우 printf 함수 인수가 int [3]이라는 경고가 나오고3), 4)의 경우 arr의 1번째 요소가 출력되는 것을 확인했습니다. int* ptr_arr_1 = arr; 은 1번의 배열 역참조 연산으로 배열 요소의 값에 접근할 수 있지만int (*ptr_arr_2)[3] = arr; 은 2번의 배열 역참조 연산으로 배열 요소의 값이 접근할 수 있는 것 같은데 가리키는 배열이 똑같은 1차원 배열인데도 왜 이런 차이가 발생하는 걸까요..??
-
미해결홍정모의 따라하며 배우는 C언어
char str[]과 char * str 의 차이는 무엇인가요?
22:16초에서 char str[]을 쓰시는데 평소에 []이런식으로 안에 아무것도 할당되어있지 않은 배열의 역할과 포인터와의 차이가 너무 궁금해서 질문드립니다. 포인터 알기를 겉핥기로 알고있어서요. 감사합니다!
-
해결됨홍정모의 따라하며 배우는 C언어
swap 함수 작성하기
홍 선생님께선 swap 함수에서 temp를 선언하실 때 정수형 자료형으로 선언하셨는데 저는 정수형 포인터 변수로 선언하고자 했어요.void swap(int* a, int* b){ int* temp = NULL; *temp = *a; *a = *b; *b = *temp; }이렇게 함수를 작성해서 코드를 실행하려고 하는데 빌드는 성공했지만 실행은 실패했어요.다만 함수를 아래처럼 고치면 정상적으로 작동하더군요.void swap(int* a, int* b){ int c; int* temp = &c; *temp = *a; *a = *b; *b = *temp;}혹시 첫 번째 코드에서 temp 변수의 주소를 NULL로 초기화 한 부분이 문제였을까요?
-
미해결홍정모의 따라하며 배우는 C언어
배열의 이중포인터
안녕하세요학습중 개념에 혼동이 생겨 질문글을 남깁니다.강의는 10.13, 4분 18초 쯤입니다. 예컨대*(*(parr + 1) + 2)가 있다 하면 이것이 어떤 값을 나타내는지 그 과정 중에서 혼란스러운 부분이 몇 개 있습니다. 질문과 더불어 제가 잘못 설명하는 부분이 있으면 지적해주시면 감사하겠습니다. parr + 1는 포인터parr 배열의 2번 째 원소(arr[1])의 첫 주소, 즉 4의 주소를 가리키는 포인터입니다. 한편, *라는 기호는 포인터변수에 저장된 주소에 접근하여 그쪽에 저장된 데이터를 들고오는 역참조의 기능을 수행케 합니다. 그렇다면 *이 붙은 *(parr + 1)에서는 4의 주소로 접근하여 *에 의해 4라는 값을 역참조해오게 됩니다. 하지만 그러면 *(4 + 2)가 되는데 이는 전혀 말이 안 되고 본래의 +2는 포인터의 산술연산을 위한 것이기에 *(parr + 1)는 모종의 포인터가 돼야 하고 강의 중에서도 교수님이 그렇게 말씀하셨습니다.(제가 오해하고 있는 부분과 달리 가장 밖에 있는 *는 실제로 역참조의 기능을 가지는 것이 자명한데도요...) 그래서 정리하자면 *(parr + 1)는 어떤 주소를 나타내것인지 아니면 모종의 포인터를 의미하는 건지 궁금하며 그리고*(*(parr + 1) + 2)의 전체적인 플로우를 정확하게 이해하고 싶습니다. 감사합니다.
-
해결됨Windows 시스템 프로그래밍 - 기본
메모리 맵 파일강의 숙제 검사
안녕하세요 선생님. 메모리 맵 파일강의 에서 내주신 숙제를 풀어 봤는데, 혹시 검사 부탁드려도 될까요?아래의 코드가 제가 작성한 코드인데 혹시 잘못된 부분이나 고치면 좋겠다 하는 부분을 알려주시면 대단히 감사하겠습니다. 그리고 따로 질문 사항이 아래와 같이 있습니다.메모리 맵 방식이 WriteFile() 방식보다 쓰기 속도가 더 빠를까요?chunkSize를 높여서 한번에 wirte하면 더 빠르다 강의에서 하셨는데, 어떠한 기준으로 메모리 효율이나 쓰기속도를 고려한 chunkSize의 최적의 사이즈를 구할수 있을까요?항상 좋은 강의 만들어 주셔서 감사합니다!#include <iostream> #include <windows.h> // Custom deleter for HANDLE struct HandleDeleter { void operator()(HANDLE handle) { if (handle != INVALID_HANDLE_VALUE) { CloseHandle(handle); } } }; typedef std::unique_ptr<std::remove_pointer<HANDLE>::type, HandleDeleter> UniqueHandle; int main() { _wsetlocale(LC_ALL, L"korean"); const wchar_t* sourceFilePath = L"C:\\TEST\\Sleep Away.zip"; const wchar_t* targetFilePath = L"C:\\TEST\\Sleep Away - copy.zip"; // Open source file UniqueHandle hFileSource{ CreateFile(sourceFilePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL) }; if (hFileSource.get() == INVALID_HANDLE_VALUE) { wprintf(L"Failed to open source file [ERROR CODE: %d]\n", GetLastError()); return 0; } // Open target file UniqueHandle hFileTarget{ CreateFile(targetFilePath, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL) }; if (hFileTarget.get() == INVALID_HANDLE_VALUE) { wprintf(L"Failed to open target file [ERROR CODE: %d]\n", GetLastError()); return 0; } // Set the size of the target file to match the source file LARGE_INTEGER fileSize; GetFileSizeEx(hFileSource.get(), &fileSize); if (!SetFilePointerEx(hFileTarget.get(), fileSize, nullptr, FILE_BEGIN) || !SetEndOfFile(hFileTarget.get())) { wprintf(L"Failed to set size of target file [ERROR CODE: %d]\n", GetLastError()); return 0; } // Create file mappings UniqueHandle hMapSource{ CreateFileMapping(hFileSource.get(), NULL, PAGE_READONLY, 0, 0, NULL) }; UniqueHandle hMapTarget{ CreateFileMapping(hFileTarget.get(), NULL, PAGE_READWRITE, 0, 0, NULL) }; if (hMapSource.get() == nullptr || hMapTarget.get() == nullptr) { wprintf(L"Failed to create file mappings [ERROR CODE: %d]\n", GetLastError()); return 0; } // Constants for the operation const DWORD chunkSize = 65536; // 64 KB DWORD bytesCopied = 0; for (LONGLONG offset = 0; offset < fileSize.QuadPart; offset += chunkSize) { DWORD size = static_cast<DWORD>(min(static_cast<LONGLONG>(chunkSize), fileSize.QuadPart - offset)); // Map a chunk from the source file auto pSrc = static_cast<char*>(MapViewOfFile(hMapSource.get(), FILE_MAP_READ, 0, offset, size)); if (pSrc == nullptr) { wprintf(L"Failed to map view of source file [ERROR CODE: %d]\n", GetLastError()); break; } // Map a chunk to the target file auto pDst = static_cast<char*>(MapViewOfFile(hMapTarget.get(), FILE_MAP_WRITE, 0, offset, size)); if (pDst == nullptr) { wprintf(L"Failed to map view of target file [ERROR CODE: %d]\n", GetLastError()); UnmapViewOfFile(pSrc); break; } // Copy the chunk memcpy(pDst, pSrc, size); bytesCopied += size; wprintf(L"%I64d%%\n", offset * 100 / fileSize.QuadPart); // Unmap the chunks UnmapViewOfFile(pSrc); UnmapViewOfFile(pDst); } wprintf(L"Copy complete! The original file size is %lld bytes and %d bytes copied.\n", fileSize.QuadPart, bytesCopied); return 0; }
-
해결됨독하게 되새기는 C 프로그래밍
stack 쌓는 순서
안녕하세요. 우분투 disas main으로 어셈블리어로 stack 이 어떻게 쌓는지 공부하는 중인데요.어셈블리어로 연산코드가 mov라서 제 해석이 틀린건가요? 지역변수는 선언한 순서로 Push된다고 이해했는데 실제로 해보니 달라서 질문드립니다. int type으로 정의한 $0x1, -0x30에서 주소가 -0x3a로 멀어져서 이해가 안돼서 질문 드렸습니다. 그 이후 부터는 stack이 하나씩 지워지면서 rbp 포인터로 가까워 지는 모양으로 이해했는데 char 형태에서 오히려 더 밀려나서 주소가 왜 밀린건지 이해가 되지않습니다. 물론 함수 호출이 아닌 변수를 정의한 거지만 결은 비슷할 거라 생각이 들어서 질문 드립니다. 너무 궁금해서 엉뚱한 질문이지만 알려주시면 감사합니다...
-
미해결홍정모의 따라하며 배우는 C언어
디버깅 관련 질문
#include <stdio.h> #include <ctype.h> #include <stdbool.h> #define STOP '.' int main() { char c; int n_chars = 0; int n_lines = 0; int n_words = 0; bool word_flag = false; bool line_flag = false; printf("Enter text :\n"); while((c = getchar()) != STOP){ if(!isspace(c)){ n_chars++; } if(!isspace(c) && !line_flag){ n_lines++; line_flag = true; } if(c == '\n'){ line_flag = false; } if(!isspace(c) && !word_flag){ n_words++; word_flag = true; } if(isspace(c)){ word_flag = false; } } printf("Charaters = %d, Words = %d, Lines = %d\n", n_chars, n_words, n_lines); return 0; } 강의 내용 예제 코드인데 문자로 입력해야 디버깅이 가능한 예제 코드들은 어떻게 디버깅 하는지 알 수 있을까요??
-
해결됨독하게 시작하는 C 프로그래밍
포인터 배열의 메모리 추적
이 코드에서 궁금한 사항이 있어 질문 드립니다. 우선 astrList, astrList[0], astrList[0][0] 각각을 메모리 주소 검색을 하였더니 순서대로astrList 의 경우astrList[0] 의 경우astrList[0][0] 의 경우이렇게 나왔는데 astrList의 주소는 변수 자체의 주소이고, astrList[0] 의 주소는 'Hello' 중 H의 주소를 가리키고 astrList[0][0] 의 주소 또한 H의 주소를 가리키는게 맞지 않을까요? 왜 astrList[0][0] 의 주소는 저런식으로 나오는지 모르겠습니다... 0x48이 H인 것은 알겟지만 왜 주소에 그 값이 들어가는지도 이해가 가지 않습니다 ㅠㅠ 그리고 astrList의 주소를 검색했을 때 나오는 맨 위 3줄에 대해서도 잘 이해가 가지 않습니다... 글이 매끄럽지 못한 점 양해부탁드리겠습니다!
-
해결됨독하게 시작하는 C 프로그래밍
해답파일 위치를 모르겠습니다
달팽이배열 도저히 못풀겠어서 해답을 보고싶은데 어디있는지 찾아도 못찾겠어요ㅜㅜ