묻고 답해요
169만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨독하게 시작하는 C 프로그래밍
예제문제와 유사한 문제 풀이 사이트
안녕하세요! 널개님 강의 듣고있는 수강생입니다.강의 내에 나와있는 예제문제 외에도 실습을 통해 실력을 향상시키고 싶습니다.혹시 실습을 할 수 있는 사이트를 추천해주실 수 있을까요?이론강의는 널개님 강의를 통해 충족이 되지만 실습은 아직도 부족하네요ㅠㅠ실습을 통해서도 배우는게 많다 생각하여 문의드립니다.항상 시간이 아깝지않은 강의해주셔서 감사합니다!
-
해결됨독하게 시작하는 C 프로그래밍
동적할당 관련 #inlude <malloc.h> 질문
안녕하십니까?독하게 시작하는 c프로그래밍 책 page 391 에 보면 _msize() 함수에 대한 설명이 있는데 예제 프로그램에서 #include <malloc.h>를 쓰셨는데 #include <stdlib.h>를 사용하지 않은 이유가 계신지 궁금합니다. 수고하십시오
-
해결됨Windows 시스템 프로그래밍 - 기본
비동기 Callback방식 코드 질문
#include <iostream>#include <windows.h>#include <stdio.h>#include <tchar.h> void CALLBACK FileIoComplete( DWORD dwError, DWORD dwTransferred, LPOVERLAPPED pO1){ printf("FileIoComplete() Callback - [%d 바이트] 쓰기 완료 -%s\n", dwTransferred, (char*)pO1->hEvent); //hEvent 멤버를 포인터로 전용했으므로 가리키는 대상 메모리를 해제한다. //이 메모리는 IoThreadFunction() 함수에서 동적 할당된 것들이다! delete[](char*)pO1->hEvent; delete pO1; puts("FileIoComplete() - return \n");}DWORD WINAPI IoThreadFunction(LPVOID pParam) { //메모리를 할당하고 값을 채운다. //이 메모리는 완료 함수에서 해제한다. char* pszBuffer = new char[16]; memset(pszBuffer, 0, sizeof(char) * 16); strcpy_s(pszBuffer, sizeof(char) * 16, "Hello IOCP"); // Allocate and initialize the OVERLAPPED structure. //OVERLAPPED 구조체의 hEvent 멤버를 포인터 변수로 전용한다! LPOVERLAPPED pOverlapped = NULL; pOverlapped = new OVERLAPPED; memset(pOverlapped, NULL, sizeof(OVERLAPPED)); pOverlapped->Offset = 1024 * 1024; //일부러 사이즈 작게 했습니다. pOverlapped->hEvent = pszBuffer; //pOverlapped->hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); // Manual-reset event //비동기 쓰기를 시도한다. //쓰기가 완료되면 완료 함수가 역호출된다. puts("IoThreadFunction() - 중첩된 쓰기 시도"); ::WriteFileEx((HANDLE)pParam, pszBuffer, sizeof(char) * 16, pOverlapped, FileIoComplete); // 함수의 주소를 쓸 수 있다. for (; ::SleepEx(1, TRUE) != WAIT_IO_COMPLETION;); { //SleepEx를 호출한 WorkerThread가 ALERTABLE_WAIT 상태가 된다/ puts("IothreadFunction() - return "); } return 0; }int tmain(int argc, TCHAR* argv[]) { HANDLE hFile = ::CreateFile(_T("TestFile.txt"), GENERIC_READ, //쓰기 모드 0, //공유 하지 않음 NULL, CREATE_ALWAYS, //무조건 생성 FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, //중첩된 쓰기->비동기 쓰기 NULL); HANDLE hThread = NULL; DWORD dwThreadID = 0; hThread = ::CreateThread( NULL, 0, IoThreadFunction, hFile, 0, &dwThreadID); WaitForSingleObject(hThread, INFINITE);}강사님 위와 같이 코드를 작성해서 비동기 call back 방식으로 시도하려고 하는데, Hello IOCP가 쓰여지지 않고 종료도 되지 않는데, 뭔가 오류가 있는 부분이 있나요? 또, 자동으로 종료도 되었으면 하는데, 가능한가요? 어떻게 수정하면 좋을까요?혹시 예제 코드를 공유할 수 있다면 가능한가요? 감사합니다.
-
해결됨독하게 시작하는 C 프로그래밍
예제파일 불러오기
문자 입출력 강의처럼 클래스 뷰에 예제 파일들을 쭉 뜨게 하는 방법을 모르겠습니다..!!
-
해결됨독하게 시작하는 C 프로그래밍
완강 후 실습 관련 질문
안녕하세요! 항상 좋은 강의 만들어 주셔서 감사합니다. 이번에 독하게 시작하는 C를 완강하고 자료구조를 듣는 중입니다. 그런데 C언어를 완강해도 능숙하게 다룰 수 있다는 느낌이 들지 않아서 C 코딩 예제를 플어보고 싶은데 혹시 추천해주실 만한 예제 사이트나 교재가 있으신가요?
-
해결됨독하게 시작하는 C 프로그래밍
개정판 출판 계획
안녕하세요.개발자는 아니지만 업무 능력 고도화를 위해 강의를 수강하고 있는 직장인입니다. 독하게 시작하는 C프로그래밍 2015년판이 절판되었고, 강의 소개에 최신 개정판을 위한 강의라고 돼 있는데혹시 최신 개정판 출판 계획과 예상 일자가 있는 것인가요?
-
해결됨독하게 시작하는 C 프로그래밍
섹션 14. 사용자 함수 필수 실습 문제
안녕하세요! 여기서 세 정수를 입력받는 함수를 사용자 함수로 만드는 과정에서 어려움이 있습니다.. 입력받는 함수는 main에 넣으면 쉬운데 이렇게 3개 정수를 넣으려니 계속 막혀요ㅠㅠ
-
해결됨독하게 시작하는 C 프로그래밍
메모리 할당 해제 방법에 대한 질문
안녕하세요 수업 잘 듣고 있습니다.malloc함수로 운영체제한테 메모리 공간을 받아온다고 배웠습니다. 이 때는 내가 사용할 메모리 크기을 명시하는데free로 메모리를 해제할 땐 내가 받아온 메모리 크기를 명시하지 않는데 어떻게 컴퓨터는 할당해준 메모리를 정확하게 해제해줄 수 있나요? 따로 어디에 할당해준 메모리 크기를 저장해두는 건가요?
-
해결됨독하게 시작하는 C 프로그래밍
섹션 13 다차원 배열 필수 실습문제
안녕하세요!! 그 섹션 13 다차원 배열 필수 실습 문제에서 이 문제 혹시 답 좀 알 수 있을까요! 최대한 간단한 답을 알고 싶습니다!!
-
해결됨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 프로그래밍
포인터 배열의 메모리 추적
이 코드에서 궁금한 사항이 있어 질문 드립니다. 우선 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 프로그래밍
해답파일 위치를 모르겠습니다
달팽이배열 도저히 못풀겠어서 해답을 보고싶은데 어디있는지 찾아도 못찾겠어요ㅜㅜ
-
해결됨독하게 시작하는 C 프로그래밍
필수실습문제 해답
챕터14 필수실습문제UI와 기능으로 나눠서 세 정수를 입력 받아 최대 값 구하는 문제를 혼자 해보고있는데해답 파일이 찾아봐도 없는거 같아서요 ! 강사님이 작성하신 해답 예시와 비교해보고 싶은데 알려주실 수 있나요? 저는 이렇게 했는데 맞게 한건지 모르겠습니다 ㅜ 코드는 잘 돌아갑니다 그리고 숫자입력을 받는 부분에서 반복문을 사용할 수도 있을까요?for문을 사용할 수 있을거 같아서 시도 해보는 중인데 중간에 막혀서 궁금합니다.막히는거보니 반복문을 쓸 수 없는 부분인거 같기도 해서요 ㅜㅜ숫자 입력 받는 부분을 반복문으로 줄일 수 있을까요?
-
해결됨독하게 시작하는 C 프로그래밍
C언어랑 관계있는지..
음 클로저와 c언어의 함수 포인터 비슷한 느낌인데 차이점은 무엇일까요클로저란 이름처럼 전역 변수처럼 사용하지만 클로저 함수만 접근 가능하기 떄문에 클로저란 이름을 쓴거 같은데 이점이 함수 포인터와 다른 점일까요... C언어 포인터 질문과 관계가 있는지 몰르겠지만 왠지 클로저 구현을 한다면 포인터를 사용한게 아닐까 싶은생각이 문득 들어서 한번 여쭤봅니다..
-
해결됨독하게 시작하는 C 프로그래밍
필수 실습 예제 질문 있습니다.
예제는점수 0~100점을 입력 받아서 80점 이상 이면 합격 그렇지 않으면 불합격이라고 출력하는 프로그램 작성입니다.#include<stdio.h>int main(void){ unsigned int input = 0; scanf_s("%d", &input); (input <= 100) ? printf("점수를 입력하세요: %d\n", input) : 0; (input <= 100) ? printf("결과 : %s", (input >= 80) ? "합격" : "불합격") : 0; return 0;}저는 이런 식으로 코드를 짰는데 잘못된 점이 있는지 궁금합니다. 0~100을 나타내는 코드가 영상에 안 나와서 질문 드립니다.
-
해결됨독하게 시작하는 C 프로그래밍
포인터 질문드립니다
개념이 잘 안 잡혀서 다시 한 번 여쭈고자 질문을 남깁니다. 변수 : 메모리 공간을 사용하는 방법포인터 : 변수가 저장된 메모리 공간의 주소변수에 바로 값을 대입 : 직접 지정포인터로 접근해 값을 대입 : 간접 지정제가 이해한 개념이 맞을까요?
-
미해결독하게 시작하는 C 프로그래밍
scanf("%d\n", &input)
수업을 듣다 궁금증이 생겨서 질문드려요~scanf("%d\n", &input);4입력시 4\n여서 종료하려면 \n하나가 더 필요 한거 까지는 이해가 됐습니다. 그후에 \n를 계속 눌러도 안넘어가지는게 어떤 것때문인지 궁금합니다.%d\n 형식을 사용하므로 형식에 안맞는 \n는 안읽고%d\n의 형식만 읽는건가요?아니면 %d\n 는 숫자와 (1개 이상의 공백문자)여서 엔터가 계속 입력되고 %d(다른정수)\n입력시 \n를사용하므로 %d만남기고 종료되는건가요?형식이 달라서 안읽는건지 \n가 1개이상의 공백문자를뜻해서 여러번읽는건지 궁금합니다!
-
해결됨독하게 시작하는 C 프로그래밍
for문 증감 연산
이 두 구문에서 차이는 증감연산자가 전위인지 후위인지 인데 for문에서는 전위든 후위든 작동 방식에 있어서는 차이가 없지 않나요? i = 0 일때 조건식을 검사해서 참이므로 i를 출력하고 i++든 ++i든 i의 값을 1 증가 시킨후에 다시 조건식을 검사하는 것으로 알고 있습니다. chat gpt에서 차이가 있다고 나오는데 설명이 명확하지 않아 여쭈어 봅니다! 정리하자면 전위와 후위의 근본적인 차이점은 알고 있지만 그것이 for문 증감식으로 쓰일땐 결과적으로 같은 동작 방식을 취하는게 아닌가 궁금합니다 감사합니다!
-
해결됨독하게 시작하는 C 프로그래밍
char ch=0;
char ch=0;ch=getchar()랑char ch=getchar(); 차이가 뭔지모르겠어요ch=0은 다른뜻이있는건가여?자료형 변수 = 정수로 정의하셨는데자료형 변수= 함수로 정의해도 나중에 문제가 생길까여?
-
해결됨독하게 시작하는 C 프로그래밍
엔디안에 대해 문의드립니다.
강의에서 문자열의 경우, 메모리를 확인했을 때 문자열의 순서에 따라서 바이너리가 정렬된 것을 알 수 있었습니다. 근데 int로 선언된 16진수 데이터의 경우는 역순으로 채워진다는 개념을 들으니 혼동이 옵니다. 혹시 문자, 문자열의 경우는 정배열이고 숫자 데이터의 경우는 역배열이다 라고 생각하면 될까요?