inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

묻고 답해요

172만명의 커뮤니티!! 함께 토론해봐요.

서보모터 질문

미해결

HAL, CubeMX, TrueSTUDIO를 이용한 STM32F4 무료 강좌

안녕하세요 강사님! 아래 서보모터 관련 질문을 썼던 학생입니다:) 같은 문제로 여러 번 질문드려 죄송합니다ㅠㅠ 강사님께서 말씀 주신대로 pwm 파형을 오실로스코프로 찍어봤는데 동작펄스폭 내에서 제대로 출력되고 있었습니다. 혹시 몰라 버튼을 누를때마다 펄스폭이 바뀌는 프로그램을 넣어서 실험해봤을 때도 펄스가 제대로 출력되고 있었습니다. 서보모터에 들어가는 전원 5v도 제대로 들어가는 것도 확인했는데, 서보모터가 동작하지 않습니다ㅠㅠ 근데 해당 서보모터를 아두이노 예제 프로그램으로 돌려보면 문제없이 돌아갑니다. 무엇이 문제인지 예상되는 원인이 있을까요?? 저는 아무리 생각해봐도 뭐가 문제인지 모르겠습니다ㅠㅠ 모터에 전원과 pwm만 제대로 인가되면 동작하는 것이 아닌가요? 사용하는 서보모터는 영상과 같은 sg90입니다!

  • c
  • iot
  • 드론-개발
규철 댓글 2 좋아요 0 조회수 376

메모리 할당 해제 방법에 대한 질문

해결됨

독하게 시작하는 C 프로그래밍

안녕하세요 수업 잘 듣고 있습니다. malloc함수로 운영체제한테 메모리 공간을 받아온다고 배웠습니다. 이 때는 내가 사용할 메모리 크기을 명시하는데 free로 메모리를 해제할 땐 내가 받아온 메모리 크기를 명시하지 않는데 어떻게 컴퓨터는 할당해준 메모리를 정확하게 해제해줄 수 있나요? 따로 어디에 할당해준 메모리 크기를 저장해두는 건가요?

  • c
  • 컴퓨터-구조
  • assembly-language
  • vc++
조현준 댓글 1 좋아요 1 조회수 551

섹션 13 다차원 배열 필수 실습문제

해결됨

독하게 시작하는 C 프로그래밍

안녕하세요!! 그 섹션 13 다차원 배열 필수 실습 문제에서 이 문제 혹시 답 좀 알 수 있을까요! 최대한 간단한 답을 알고 싶습니다!!

  • c
  • 컴퓨터-구조
  • assembly-language
  • vc++
dhwkdrns99 댓글 2 좋아요 0 조회수 291

swap 함수에서 printf문 질문있습니다

미해결

홍정모의 따라하며 배우는 C언어

수업 내용의 프린트 구문은 void swap(int* u, int* v) { printf("%p %p\n", u, v); int temp = *u; *u = *v; *v = temp; } 이런식으로 되어있는데 u와 v에 &기호를 붙혀주면 a, b 와 주소가 다르게 나오는데 어떤 주소인지 잘 모르겠습니다..

  • c
cksgur 댓글 1 좋아요 1 조회수 329

10.14강 11:11 질문이 있습니다.

해결됨

홍정모의 따라하며 배우는 C언어

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
쉽지않네 댓글 1 좋아요 2 조회수 333

char str[]과 char * str 의 차이는 무엇인가요?

미해결

홍정모의 따라하며 배우는 C언어

22:16초에서 char str[]을 쓰시는데 평소에 []이런식으로 안에 아무것도 할당되어있지 않은 배열의 역할과 포인터와의 차이가 너무 궁금해서 질문드립니다. 포인터 알기를 겉핥기로 알고있어서요. 감사합니다!

  • c
홍진기 댓글 1 좋아요 1 조회수 476

swap 함수 작성하기

해결됨

홍정모의 따라하며 배우는 C언어

홍 선생님께선 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
  • 포인터
  • swap
정인식 댓글 1 좋아요 1 조회수 385

RS232c Serial 통신 관련 질문이 있습니다.

미해결

안녕하세요 연구실에서 자체적으로 실험기기와 컴퓨터랑 통신을 진행하는 중인데, 하나가 해결이 안 되어서 너무 답답해서 고수님들께 자문을 구하려고 합니다. Rs232 rtu 모드를 지원한다고 한 OS-20 overhead stirrer과 통신을 진행 중 입니다. 이 친구의 통신 규격과 방식은 아래 그림 3개와 같습니다. 이중 stirrer control 부분을 제가 참조해서 저 command를 hex 방식으로 입력하였는데 도무지 안되는 겁니다. 그런데 웃긴게 이 회사에서 지원하는 공식 통신프로그램을 사용하면 작동이 잘 되더군요. Instruction overview에서 나온 규칙은 다음과 같습니다. Command 구조는 Prefix Instruction_code Data_frame Checksum로 되어 있고 입력의 prefix는 0xfe로 시작하며 responce는 0xfd로 시작합니다. 모든 바이트 사이에는 50ms delay가 존재해야하며 Dataframe은 큰 수 자리부터 전송합니다. ex) 1000rpm을 data frame에 입력하려고 할 시 Hex값이 03E8이니까 앞에 두 자리를 0x03에 해당하고 뒤에 두 자리를 0xE8로 해당시킵니다. Null은 0x00입니다. Checksum 방식은 0xfe,0xfd인 prefix를 제외하고 나머지를 전부 더한 값으로 0xnn 이런식으로 표현됩니다. 신기하게도 16진수의 2자리를 넘어가도 뒤에 2 자리만 붙이면 된다고 하더군요. ex) 0xfe 0xb1 0x03 0xe8 0x00 checksum인데 0xfe를 제외하고 다 더하면 019c이지만 0x9c만 입력하면 되는 형식입니다. 그래서 이 규칙대로 코드를 짜서 통신을 해 보았는데, 아무리 해도 안되어서 너무 답답합니다. 심지어 제가 잘못했는지 확인하려고 시리얼 통신 sniffer을 사용하여서 공식 프로그램에서는 어떻게 통신이 되나 뜯어보았습니다. 결과는 아래 사진과 같습니다. 제가 python으로 작성한 코드는 아래와 같습니다. import serial import time ser = serial.Serial( port='COM7', # Update with your actual port baudrate=9600, parity=serial.PARITY_NONE, # No parity stopbits=serial.STOPBITS_ONE, # 1 stop bit bytesize=serial.EIGHTBITS # 8 data bits ) def send_hex_string(hex_string): # Convert the hex string to bytes byte_data = bytes.fromhex(hex_string) # Send the bytes over the serial port ser.write(byte_data) def send_hex_string_with_delay(hex_string, delay_ms=50): for i in range(0, len(hex_string), 2): # Extract each pair of characters and convert to bytes hex_pair = hex_string[i:i + 2] byte_data = bytes.fromhex(hex_pair) # Send the bytes over the serial port ser.write(byte_data) # Wait for the specified delay time.sleep(delay_ms / 1000.0) command = 'feb103e8009c' send_hex_string_with_delay(command) ser.close() 또한 파이썬에서의 결과를 시리얼 전송으로 보면 다음과 같습니다. 입력은 제대로 되는데 기기에는 반응이 제대로 나오지 않네요... 제가 잘못하고 빠뜨린 점이 있을까요? 읽어주셔서 정말 감사드립니다.

  • rs232
  • serial
  • 커뮤니케이션
  • python
전성훈 댓글 1 좋아요 1 조회수 1023

배열의 이중포인터

미해결

홍정모의 따라하며 배우는 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) 의 전체적인 플로우를 정확하게 이해하고 싶습니다. 감사합니다.

  • c
Echapper4 댓글 1 좋아요 2 조회수 371

메모리 맵 파일강의 숙제 검사

해결됨

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
  • system-programming
  • vc++
박경훈 댓글 1 좋아요 0 조회수 280

stack 쌓는 순서

해결됨

독하게 되새기는 C 프로그래밍

안녕하세요. 우분투 disas main으로 어셈블리어로 stack 이 어떻게 쌓는지 공부하는 중인데요. 어셈블리어로 연산코드가 mov라서 제 해석이 틀린건가요? 지역변수는 선언한 순서로 Push된다고 이해했는데 실제로 해보니 달라서 질문드립니다. int type으로 정의한 $0x1, -0x30에서 주소가 -0x3a로 멀어져서 이해가 안돼서 질문 드렸습니다. 그 이후 부터는 stack이 하나씩 지워지면서 rbp 포인터로 가까워 지는 모양으로 이해했는데 char 형태에서 오히려 더 밀려나서 주소가 왜 밀린건지 이해가 되지않습니다. 물론 함수 호출이 아닌 변수를 정의한 거지만 결은 비슷할 거라 생각이 들어서 질문 드립니다. 너무 궁금해서 엉뚱한 질문이지만 알려주시면 감사합니다...

  • c
  • kernel
  • secure-coding
ㅇㄴㄹ(ㅇㅀ) 댓글 1 좋아요 0 조회수 532

디버깅 관련 질문

미해결

홍정모의 따라하며 배우는 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
cksgur 댓글 1 좋아요 1 조회수 200

포인터 배열의 메모리 추적

해결됨

독하게 시작하는 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
  • 컴퓨터-구조
  • assembly-language
  • vc++
psbtyu123 댓글 1 좋아요 0 조회수 316

강의 자료 부탁드립니다!

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

안녕하세요. 강의 자료 요청합니다. elel3418@daum.net 감사합니다!

  • python
댓글 1 좋아요 0 조회수 216

해답파일 위치를 모르겠습니다

해결됨

독하게 시작하는 C 프로그래밍

달팽이배열 도저히 못풀겠어서 해답을 보고싶은데 어디있는지 찾아도 못찾겠어요ㅜㅜ

  • c
  • 컴퓨터-구조
  • assembly-language
  • vc++
조희선 댓글 1 좋아요 0 조회수 399

매개변수는 포인터, 함수 내에서는 배열?

해결됨

홍정모의 따라하며 배우는 C언어

안녕하세요 강의 듣던 중 궁금한 게 생겨 여쭙게 됩니다. double average(double * data_array, int n) { printf("Size = %zd in function average\n", sizeof(data_array)); double avg = 0.0; for (int i = 0; i < n; ++i) { avg += data_array[i]; } avg /= (double)n; return avg; } (1) 위의 코드에서 average함수의 매개변수로 포인터변수인 data_array 가 들어와 있습니다. double * data_array 를 arr1[] 로 바꿔도 시스템은 이것을 arr1 배열의 첫주소를 가지는 포인터변수 double * (배열명) 로 인식한다는 것이 정확한 이해인가요? (2) average함수의 매개변수에 배열을 넣든 뭘 하든 시스템은 배열의 첫 주소를 가지는 포인터 변수로 읽어버립니다. 하지만 코드의 중간 쯤에 있는 avg += data_array[i]; 에서 data_array[i] 는 배열의 문법입니다. 물론, 예컨대 arr배열이 있을 때 *(arr+10) 와 array[10] 가 같은 요소를 가져온다는 것은 압니다. 하지만 average함수는 기존에 저희가 적은 배열의 정의를 못 만나봤고, 즉 알지 못하고 그 배열의 첫 주소만 가지고 있는 포인터변수만을 가지고 있습니다. 이 때 data_array[i] 라고 작성하면 시스템이 이것을 내부적으로 *(data_array + i) 즉, (본 강의에서는 배열명이 arr1 이었습니다) *(arr1 + i) 로 바꿔버리나요? 즉, 다시 말해 배열arr1 을 알지 못하고 배열arr1의 첫 주소값이 있는 포인터 변수만을 가지고 있는 함수 average가 어떻게 포인터 문법이 아닌 배열 문법을 쓰는지 궁금합니다. 긴 글 읽어주셔서 감사합니다.

  • c
Echapper4 댓글 1 좋아요 1 조회수 270

print 출력

미해결

프로그래밍 시작하기 : 파이썬 입문 (Inflearn Original)

선생님처럼 깔끔하게 괄호 안에 있는 부분만 뜨는 게 아니라 저 파란 줄로 길게 뜨는 건 왜 그런 건가요? 어떻게 하면 없앨 수 있나요?

  • python
hjy648012 댓글 2 좋아요 0 조회수 324

kernelMatCpy에서는 __syncthreads가 필요없지 않나요

해결됨

CUDA 프로그래밍 (4) - C/C++/GPU 병렬 컴퓨팅 - 행렬 matrix 곱하기

제목 그대로 kernelMatCpy에서는 각 스레드 작업이 다른 스레드에 영향을 주지 않기 때문에 필요없을 것 같은데요. 실제로 __stncthreads()를 제거하고 돌려봐도 정상적으로 결과가 나오구요. 혹시 이런 경우라도 내부적으로 꼬일 수 있어서 사용하신 것인지 아니면 대부분의 shared memory로 복사해서 쓰는 경우에 필요하기 때문에 습관(?)차원에서 사용하신 것인지 궁금합니다.

  • c
  • c++
  • cuda
  • gpu
  • 병렬-처리
최준석 댓글 1 좋아요 0 조회수 244

포인터 주소 대입

미해결

홍정모의 따라하며 배우는 C언어

안녕하세요 int *a = &b; 코드가 위와 같을 때는 변수 b의 주소를 포인터변수 a에 넣는 걸로 이해했습니다. int *a = 123; 코드가 위와 같을 때도 포인터변수 a 에 123이라는 메모리 주소를 넣는다고 이해해도 될까요?

  • c
Echapper4 댓글 1 좋아요 2 조회수 250

인기 태그

인프런 TOP Writers

주간 인기글