본문 바로가기

분류 전체보기894

[ C언어 ] realloc은 얼마나 자주 메모리 주소를 옮길까? realloc함수에 대한 설명을 찾아보면 다음과 같은 과정으로 작동한다고 한다. 1. 동적할당된 메모리 크기를 변경해 재할당함 (기존 주소일수도 있고, 새로운 주소일 수도 있음) 2. (새로운 주소에 할당한 경우) 기존 주소에 있던 값을 새로운 주소에 복사하고 원래 주소는 할당해제함 얼마나 많이 메모리 주소를 옮겨갈까 궁금해서 아래 코드로 테스트를 해보았다. #define _CRTDBG_MAP_ALLOC #include #include #include #include int main(void) { int arraysize = 10; int i = 0; char* test = (char*)malloc(sizeof(char) * arraysize); int plus = 10; float chk = 0; fo.. 2022. 5. 2.
[ 아두이노 ] I2C LCD로 문자 출력 + 한 칸 씩 옆으로 이동 + 커스텀으로 한글 출력 + 타이머 출력 원리 LCD(Liquid Crystal Display)는 액정표시장치로 스스로 발광하지 않기 때문에 후면에 백라이트가 있고, 전면에 있는 액정에 전기적 신호를 가해 빛을 통과시키거나 차단하는 방식으로 문자를 표시한다. 다양한 규격이 있는데 보통 아두이노와는 16×2 character LCD 를 주로 사용하고 기존의 LCD는 핀이 너무 많아 사용에 불편함이 있었기 때문에 아래 사진과 같은 I2C모듈이 뒤에 납땜된 형태로 판매된다. 1행에 16문자 x 2행, 총 32문자를 표현할 수 있다. 1문자는 5x8의 픽셀 그리드에 의해 표현된다. 혹시 작동이 안된다면 1. 왼쪽의 백라이트 점퍼가 잘 꼽혔는지 확인해보자. 저게 접지되어있어야 Backlight On이 된다. 2. 파란색 가변저항에 드라이버를 넣고 돌려서.. 2022. 5. 2.
[ 아두이노 ] 초음파센서로 측정한 거리를 LCD 화면에 표시하기 준비물아두이노초음파센서I2C LCD모듈점퍼선브레드보드등 회로 코드#define trigPin 8#define echoPin 9#include #include "NewPing.h" // 헤더 포함LiquidCrystal_I2C lcd(0x27,16,2);NewPing sonar(8, 9);void setup(){ lcd.init(); // lcd 객체 초기화 lcd.clear(); // 화면 지우고 커서를 왼쪽 상단 모서리로 옮김 lcd.backlight(); // 백라이트 온 lcd.setCursor(0,0); // 0행 0열로 커서 옮김 lcd.print("Distance in cm : "); // 문자 출력 }void loop(){ float duration = sonar.p.. 2022. 5. 2.
[ C언어 ] scanf의 리턴값 놀랍게도 scanf에는 리턴값이 있다. 함수가 읽어들여 저장에 성공한 데이터 개수가 반환값이다. 예를들어 위의 경우에는 정수 2개를 b, c 변수에 저장하는데 성공했으므로 리턴값이 2이다. 정수를 입력해야하는데 문자를 입력한 경우 변수 b, c에 저장하는것 둘 다 실패했으므로 리턴값이 0 변수 b에 저장하는 것만 성공했으므로 리턴값이 1 그런데 순서를 바꿔서 a 1 을 입력하면 scanf의 리턴값이 0이다. 이는 변수 b에 저장되지 못한 문자들(개행문자 포함)이 입력버퍼에 남아 그 다음 입력을 방해하니 변수 c에 저장하는 것 또한 실패한 것이다. 이에대한 해결방법 링크 : https://eteo.tistory.com/33 scanf, scanf_s "%d"로 정수 입력 받으려다 문자(열)이 잘못 들어왔을.. 2022. 4. 27.
[ C언어 ] scanf 공백 ( 띄어쓰기 ) 포함 원하는 길이 만큼만 문자열 입력 받는 방법. 공백을 포함해서 입력받는 동시에, 배열의 길이를 넘는 입력이 들어오더라도 오류가 나지 않고 지정된 길이 만큼만 변수에 저장되는 받는 방법을 소개한다. 첫번째 방법 1. "%숫자[^\n]" #include int main(void) { char str[20]; printf("도서 이름을 입력하세요 :"); scanf_s("%20[^\n]", str, sizeof(str)); //fgets(str, 19, stdin); printf("입력하신 도서이름은 %s 입니다.\n", str); return 0; } 예를들어 char 배열의 크기가 20인 경우, null문자가 들어갈 공간을 생각해서 그보다 작은 숫자를 지정해주면 아무리 입력이 많이들어와도 딱 그 길이 만큼만 배열에 저장된다. 한글의 경우 2바이트를 차.. 2022. 4. 27.
scanf , scanf_s " %d "로 정수 입력 받으려다 문자(열)이 잘못 들어왔을 때 무한루프에 빠지는 문제 / 문장 씹히는 문제 해결 사용자가 꼭 우리가 기대한대로 입력하라는 법이 없으니 이러한 예외처리도 필요하다. scanf, scanf_s %d로 정수 입력 받으려다 문자나 문자열이 들어왔을 때 무한루프에 빠지는 문제 혹은 다음 문장이 씹히고 그 다음으로 넘어가는 문제의 해결책은 동일하다. 입력버퍼를 비워주면 된다. scanf 함수는 %d 정수형을 입력받기 위해 대기하고 있었는데 문자/문자열이 들어오니 값을 대입하지 못하고 그게 입력스트림에 계속 남아서 문제를 일으키는 것이다. 입력 버퍼를 비우는 방법으로 구글링을 해보면 다음과 같은 방법이 나온다. 1. fflush(stdin) -> 사용X fflush 함수는 원래 출력버퍼를 비우는 용도이기에 사용하지 말라고 함. (출처 : C언어 열혈 프로그래밍 책) 2. rewind(stdin).. 2022. 4. 27.
[ C언어 ] enum 의 활용 + 사용예제 열거형 enum은 관련이 있는 정수형 상수의 집합으로 typedef로 별칭을 정의하면 더욱 편리하게 사용 가능하다. 간단한 예제 #include typedef enum { FALSE, TRUE }boolean; typedef enum { MALE =1, FEMALE }gender; int main(void) { boolean exit=FALSE; char answer; while (exit == FALSE) { printf("성별을 입력하세요(1.남자, 2.여자):"); scanf_s("%hhd", &answer); rewind(stdin); if (answer == FEMALE) { printf("여자입니다.\n"); } else if (answer == MALE) { printf("남자입니다.\n").. 2022. 4. 26.
[ 아두이노 ] 초음파 거리 측정 센서 HC-SR04 데이터 시트 : https://netsonic.fi/en/files/HCSR04-datasheet.pdf 원리 초음파는 인간의 가청 한계를 넘는 고주파음이다. Trig핀으로 최소 10μS이상의 high(5V) 펄스가 들어오면 Transmitter 에서 40KHz초음파를 8회 발사한다. echo핀은 high 상태가 되고 물체를 맞고 반사된 초음파를 reciever 가 수신하면 다시 echo핀은 low상태가 된다.(앞에 물체가 없어 발사된 후 38ms동안 수신이 없으면 echo 핀이 다시 low 상태가 됨.) 음속은 340m/s 니까 echo핀의 high pulse duration을 아두이노의 pulsein 함수로 재고 거리=속력*시간 공식으로 계산하면 물체와의 거리를 계산할 수 있다. 측정범위 : 2cm .. 2022. 4. 25.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (4) - 파일 입출력 - fopen / fopen_s, .bin 바이너리 파일 읽기 / 쓰기 파일 입출력 기능을 추가한 도서 관리 프로그램 개선 4탄. 2022.04.22 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 (확대/축소) 이전까지는 내가 프로그램을 켜고 도서 추가/삭제를 해도 끄고 나서 프로그램을 다시키면 여전히 내가 소스파일에 입력해놓은 초기데이터가 보였었다. 하지만 나는 프로그램 실행중에 데이터를 가공하고 껐을 때 그 데이터가 어딘가 잘 저장되어 있다가 다시 키면 읽어오는 방식으로 연속적으로 관리하고 싶어졌다. 결과물 투척 파일 읽기 FILE* fp = NULL; errno_t err = fopen_s(&fp, "booklist.bin", "rb"); if (err == 0) { .. 2022. 4. 25.
AI 프로젝트 , 두더지 게임 with Mediapipe and Python Language : PythonLibrary : Mediapipe 이 프로젝트는 웹캠 화면에 나타난 두더지를 잡아 제한시간 내에 점수를 내는 게임입니다.Mediapipe Pose를 통해 인식된 손과 발의 좌표가 랜덤으로 출력되는 두더지 이미지 좌표범위와 일치할때 두더지를 잡을 수 있습니다.    처음 실행 시 화면에 Clap to start a game이라고 표시했다. 사용자가 적당한 거리를 두고 시작할 수 있도록 화면에 빨간 타원을 그리고 원 안에 얼굴을 위치시키라고 안내문을 적었다. 박수를치면 30초가 주어지고 게임 시작.   손(중지)의 좌표가 두더지이미지좌표 범위 안에 들어가면 score++하고 spark이미지를 오버레이한 후 랜덤좌표를 다시 받아서 두더지가 새로운 곳에 나타날 수 있게 한다. 제.. 2022. 4. 24.
size_t 와 unsigned int 형의 차이 size_t 는 부호 없는 정수로서 포인터나 메모리의 크기를 나타내는 데 사용되는 데이터 타입이다. stddef.h 헤더 파일에서 정의되어 있으며 플랫폼에 따라 그 정의가 달라진다. 일반적으로 32비트 아키텍처에서는 unsigned int로 정의되고, 64비트 아키텍처에서는 unsigned long long 으로 정의된다. sizeof() 함수를 사용해서 size_t 타입의 크기를 확인해보자. Visual Studio에서 프로젝트 빌드 구성을 x86으로 하면 4 byte, x64로 선택하면 8 byte로 확인된다. 아래 사이트에서도 확인 가능하다. https://www.ibm.com/docs/ko/ibm-mq/7.5?topic=ssfksj-7-5-0-com-ibm-mq-ref-dev-doc-q104610.. 2022. 4. 24.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 지난편에 이어 도서 삭제기능을 동적할당을 사용한 버전으로 바꿔보자. 2022.04.12 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 처음으로 돌아가서 삭제기능은 먼저 검색을 수행하고 검색결과를 출력해서 보여준 뒤 삭제할지 말지 선택을 입력받고 삭제하게 해야했다. 그럼 삭제함수 안에서 검색함수를 호출해야하고 그 검색결과가 담긴 데이터가 필요한데 여기서 문제가 있다. 일반적으로 검색함수 내에서 변수(배열)를 선언하면 그 지역변수는 함수를 빠져나오면서 소멸된다. 하지만 내가 필요한 검색결과가 담긴 변수의 수명은 검색함수의 시작과 끝을 함께하면 안된다. 삭제함수가 필요할 때 생성되고 삭제후 필요없어지면 사라져도 되는데 이런상황을 위해 동적할당이 .. 2022. 4. 22.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (3) - 동적 메모리 할당 - 구조체 배열 크기 동적 조절 ( 확대 / 축소 ), #ifdef DEBUG 사용 동적 메모리 할당을 적용한 도서 관리 프로그램 개선 3탄. 2022.04.17 - [Language/C] - [C언어] 프로젝트(삽질일기) : 도서 관리 프로그램 - (2) - 동적 메모리 할당 이전 까지는 #define을 통해 구조체 배열인 booklist의 SIZE를 20으로 고정했었다. 하지만 동적 메모리 할당을 한번 해보니 더 본격적으로 써보고 싶어진다. 도서가 계속 추가 되어 배열이 꽉 찬다면 배열의 크기를 늘리고 싶고 데이터가 줄어들어 빈공간이 널널한다면 배열을 다시 축소하고 싶은데 어떻게 하면 될까? 참고로 배열을 선언할 땐 대괄호 안에 변수를 넣을 수 없다. 선언한 뒤 사용할 때는 인덱스 자리에 변수를 넣어서 활용 할 수 있지만 선언 할때 변수를 넣으면는 위와 같이 C2466 에러가 난다... 2022. 4. 22.
구조체의 크기 / 구조체 정렬 - 패딩비트를 #progma pack 사용으로 해결 구조체의 크기가 생각과는 달라서 당황했던 적이 있는데 구글링을 통해 쉽게 답을 찾았다. 위 구조체의 size는 1 byte가 맞다. 하지만 구조체 안에 여러 자료형이 들어있으면 어떻게 될까? #include typedef struct { char a;// 1 byte int b;// 4 byte double c;// 8 byte } TEST; int main(void) { TEST test; printf("구조체멤버 a의 크기 : %d\n", sizeof(test.a)); printf("구조체멤버 b 크기 : %d\n", sizeof(test.b)); printf("구조체멤버 c 크기 : %d\n", sizeof(test.c)); printf("구조체 test 크기 : %d\n", sizeof(TEST).. 2022. 4. 20.
[ 아두이노 ] LED의 정격 전압과 전류 색상마다 약간의 차이는 있는데 데이터 시트를 통해 확인해보자 평균 2.1V 최대 2.6V 정격전압이 2.1V이다 Absolute Maximum Ratings 단 한순간도 넘으면 안되는 peak 전류는 30mA LED의 밝기는 전류에 비례하지만 30mA는 단한순간도 넘으면 안되기에 20mA미만이 사용하기 적당하다고 한다. 아두이노 핀의 출력전압은 5V니까 저항을 달아서 LED에 걸리는 전압을 조절해주기 위해서 저항을 달아주어야하는데 V=IR 직렬연결 시 아래 공식으로 계산한다. (입력전압-LED사용전압)V/사용전류A = 저항값Ω (5V-2.1V) / 0.02A = 145Ω 보통 사용하는 표준저항값이 아니니까 계산해서 나온값보다 한단계 큰 저항을 선택하면된다. 일반적으로 LED에 220옴짜리를 많이 쓰는데 .. 2022. 4. 14.
64비트 운영체제인데 포인터 크기가 왜 4바이트라고 나올까? char* p1; int* p2; double* p3; printf("%d\n", sizeof(p1)); printf("%d\n", sizeof(p2)); printf("%d\n", sizeof(p3)); 분명 수업에서 들었을 때는 8바이트가 나올거라고 했는데 실제 위와같이 코드를 치고 실행해보니 4바이트 라고 나왔다.. 열심히 검색해보니 이유는 내가 사용하는 Visual Studio에서 32비트 용으로 컴파일 하기 때문.. 솔루션 플랫폼을 x86이 아니라 x64로 바꿔주면 8바이트라고 제대로 뜬다. 그리고 리눅스 64비트 환경에서도 gcc로 컴파일 하니 8바이트라고 떴다. 주소값도 16진수로 16자리나 된다. 결론은 내가 개발하고 있는 pc의 환경이 아니라 어느 플랫폼을 대상으로 컴파일하냐에 따라 포인.. 2022. 4. 14.
[ C언어 ] 프로젝트(삽질일기) : 도서 관리 프로그램 - (1) - 구조체 배열 book.h #ifndef __BOOK_H__ #define __BOOK_H__ #define SIZE 20 typedef struct { char year; char month; char day; }_stDate; typedef struct { char title[30]; int price; char author[10]; int page; _stDate date; } _stBook; char DispMenu(char num); char CountData(_stBook list[]); char AddBook(_stBook list[], char num); void PrintBook(_stBook list[], char num); char RmBook(_stBook list[], char num); voi.. 2022. 4. 12.
[ IntelliJ ] 설치 + Live Templates + 필수 단축키 등 설치하기 1. JDK (Java Development Kit) 설치 (https://adoptopenjdk.net/) 2. IDE Intellij 설치 (https://www.jetbrains.com/idea/) 3. IntelliJ 실행 후 Project SDK를 선택하는 화면에서 JDK가 설치된 경로를 선택하고 Next 클릭. C:\Program Files\Eclipse Adoptium\jdk-17.0.2.8-hotspot File - Setting - Editor - Live Templates 에서 언어별로 자주쓰는 코드를 자동완성 축약어로 등록해 둘 수 있다. 예를들면 Java 소스코드 작성시 main만 치면 메인 메소드가 자동완성되고 sout만 치면 System.out.println() 가 자동.. 2022. 4. 12.
[ VMware ] 에서 USB 인식이 안될 때 문제 해결 윈도우키+R키로 실행창을 열고 services.msc 를 입력 VMware USB Arbitration Service 를 찾아서 시작유형은 자동으로 하고 시작을 눌러 상태를 실행중으로 바꿔줌 VMware 세팅창을 열어 Hardware 부분에 USB Controller가 add되어 있고 Connections에는 show all USB input devices 가 체크되어 있는지 확인 이제 가상환경에서 usb를 꽂으면 게스트os에 연결할지 묻는 창이 뜨고 확인을 누르면 된다. lsusb 명령어로 확인해 보니 잘 인식 됨. 2022. 4. 5.
[ Mediapipe ] Ubuntu Linux에 설치하고 실행해보기 with python on VirtualBox 실행환경 Virtual Box Ubuntu 20.04.4 LTS desktop ver Python 3.8.10 OpenCV 4.5.5 0. 파이썬 설치되어있는지 확인하고 안되어있으면 설치하기 Ubuntu 20.04버전을 깔았다면 Python 3.x 버전이 이미 설치되어있다. dpkg -l 명령어로 현재 깔려있는지 알 수 있으며 안깔려 있는 경우 다음 명령어로 설치가능 sudo apt-get install python3 1. pip 설치하기 sudo apt-get update sudo apt-get install python3-pip 2. pip로 OpenCV 라이브러리 설치 pip3 install opencv-python 잘 설치가 됐다 warning이 떴으니 ~/.bashrc 를 열어 PATH 추가도 .. 2022. 4. 4.
Mediapipe ] Windows에 Mediapipe 설치하고 실행해보기 with python 0. 준비사항 : Python을 설치한다. 파이썬 패키지 매니저인 pip도 같이 설치되었을 것이다. 1. cmd창을 열고 다음과 같이 친다 pip install mediapipe opencv-python 2. mediapipe 공식사이트에서 hand 예제를 긁어와 hand.py 로 저장한다. import cv2 import mediapipe as mp mp_drawing = mp.solutions.drawing_utils mp_drawing_styles = mp.solutions.drawing_styles mp_hands = mp.solutions.hands # For static images: IMAGE_FILES = [] with mp_hands.Hands( static_image_mode=True,.. 2022. 4. 4.
[ C언어 ] 중복없이 난수생성 / 랜덤값 뽑기 / 로또번호 생성 / 선택정렬 (rand, srand, time 함수) 1. stdlib.h, time.h 헤더파일 포함하기 #include #include 2. 메인함수 안쪽 상단에 srand((unsigned)time(NULL)); 를 한번만 사용 srand((unsigned)time(NULL)); 진정한 의미의 난수생성을 위해 time을 seed값으로 넣어주는 부분, 간혹 컴파일 에러가 뜨는 경우가 있어 unsigned로 캐스팅해준다고 한다. 3. rand() 함수와 % 나머지연산자를 활용하여 랜덤값 생성 예를들어, 0~9 사이의 난수생성을 원한다면 rand()%10 1~10 사이의 난수생성을 원한다면 (rand()%10)+1 4. 중복없이 난수 뽑기 만약 뽑아야할 난수의 갯수가 많지 않다면 이런 방법도 있다. for (;;) { a = rand() % 10; b = .. 2022. 4. 4.
[ Cygwin ] 설치 및 패키지 설치 Cygwin 은 윈도우에서 여러 리눅스 프로그램과 명령어 배쉬셸을 사용할 수 있게 해주는 프로그램이다. 시그윈 설치 https://www.cygwin.com/install.html 빠른속도를 위해 kr이 붙은 미러사이트 선택 중간에 Select Packages 화면에서 유용한 패키지 들을 같이 설치해 줄 수 있는데 All-catecory를 열고 devel 카테고리에서 gcc-core, make나 cmake 등 editor 카테고리에서 vim 등을 같이 설치해주자. 드롭다운을 열고 버전 선택 추후 apt-cyg 명령어를 사용해 필요한 패키지를 Cygwin 콘솔에서 설치할 수 있게 하기 위해 wget도 같이 설치해준다. 아니면 나중에 설치파일을 다시 실행해서 패키지를 추가 설치해줄 수 도 있다. 참고로 Cy.. 2022. 4. 4.
[ Cygwin ] home directory 바꾸는 법 Cygwin을 설치한뒤 cd ~ pwd 를 치면 현재 홈디렉터리를 알 수 있는데 초기 홈디렉토리는 /home/user name 으로 설정되어있다 만약 다른 드라이브로 가고 싶다면 cd /cygdrive/d or e 등을 터미널에 입력하면 된다. 그럼 사용상 편리함을 위해 홈디렉터리를 바꿔보자 cygwin이 설치된 폴더를 찾아가 cygwin64\etc\nsswitch.conf 파일을 에디터로 연다 다음과 같이 db_home: 부분을 주석처리 해제하고 원하는 경로로 수정해준뒤 껐다 키면 적용이 된다. 바꾼 후 echo $HOME 을 입력하여 잘 바뀌었는지 확인해보자 2022. 3. 31.