본문 바로가기

프로그래밍226

C ] 가변인자 함수 만들기, 가변인자 출력함수 만들기 printf() 함수의 경우 내가 원하는 만큼 인자를 넘길 수있다. 예를 들면 printf("%d", a);// 인자 2개 printf("%d %d", a, b);// 인자 3개 이게 가능한 이유는 printf()가 매개변수의 개수가 정해지지 않은 가변인자 함수이기 때문이다. 가변인자 함수로 인자의 개수와 상관없이 정수형 인자를 여러개 받아서 인자 모두를 더한 값을 반환하는 함수를 만들어보도록 하겠다. #include // stdarg.h 포함. va_list, va_start, va_arg, va_end가 정의된 헤더 파일 #include int sum(int num_args, ...) { // 가변 인자의 개수를 받음, ...로 가변 인자 설정 va_list ap;// 가변 인자 목록 포인터 va_s.. 2022. 8. 12.
MFC ] 시리얼 통신으로 LED 제어하기 (3) + MySQL (IoT) STM32 → UART 수신 인터럽트로 '1'이 들어오면 LED를 켜고 '0'이 들어오면 LED를 끈다. MFC → 외부 DB에 접속해 '1' 또는 '0'이 들어있는 1행1열의 테이블을 타이머를 사용해서 0.5초 간격으로 읽어오고 해당 값을 STM32에 시리얼 통신으로 송신한다. STM32 수신 인터럽트 부분 /* USER CODE BEGIN 4 */ void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart->Instance == USART3){ if(rx=='1'){ HAL_GPIO_WritePin(GPIOB, GPIO_PIN_0, 1); HAL_GPIO_WritePin(GPIOB, GPIO_PIN_7, 1); HAL_GPIO_WritePi.. 2022. 7. 17.
MFC ] 실시간 그래프 그리는 법 Real-Time-Chart sin, cos, tan 그래프를 10ms 마다 그리는 예제파일 다이얼로그의 Picture Control을 아이디 IDC_STATIC_RT_GRAPH 로 추가하고 위치와 크기를 맞춘다. 다이얼로그의 -Dlg.h 파일에서 OScopeCtrl.h 파일을 include 하고 COScopeCtrl 컨트롤의 객체 포인터 _rtGraph를 선언해 둔다. // COScopeCtrl의 헤더 파일 인클루드 #include "OScopeCtrl.h" ... class *Dlg : public CDialog { ... // COScopeCtrl 컨트롤의 객체 포인터를 선언 COScopeCtrl *_rtGraph; ... }; onInitDialog() 함수에서는 IDC_STATIC_RT_GRAPH 컨트롤의 위치와 크기를 얻.. 2022. 7. 17.
MFC ] 다이얼로그 종료시 함수 호출 순서 OnClose, OnDestory, PostNcDestroy X 버튼을 눌러서 다이얼로그를 종료한경우 OnSysCommand start OnClose OnSysCommand end DestroyWindow start OnDestroy DestroyWindow end OnNcDestroy start PostNcDestroy OnNcDestroy end EndDialog(), OnOk(), OnCancel() 등을 이용하여 다이얼로그를 종료한경우 DestroyWindow start OnDestroy DestroyWindow end OnNcDestroy start PostNcDestroy OnNcDestroy end 출처 : https://wendys.tistory.com/117 보다시피 WM_CLOSE 메시지의 핸들러인 OnClose()는 EndDialog(), On.. 2022. 7. 15.
MFC ] CString 문자열 파싱하는 여러 방법 2022.07.14 - [프로그래밍/MFC (C++)] - MFC ] stringstream 사용하여 문자열 파싱하기 일전에 CString 타입을 string 타입으로 바꾸고 stringstream을 사용해서 파싱하는 방법에 대한 글을 적었는데 다른 방법도 있다. 1. AfxExtractSubString 을 사용하는 방법 int lineCount; lineCount = result.Replace('\n',','); for (int i = 0; i < lineCount; i++) { CString tmpID, tmpName, tmpAuthor, tmpPrice, tmpOther; AfxExtractSubString(tmpID, result, 5 * i + 0, ','); AfxExtractSubString.. 2022. 7. 14.
MFC ] 리스트 컨트롤 제일 하단으로 내리는 법 m_list.SendMessage(WM_VSCROLL, SB_BOTTOM); 아래는 리스트 컨트롤 새로고침 시마다 자동으로 아래로 내려가게끔 한 것 2022. 7. 14.
MFC ] stringstream 사용하여 문자열 파싱하기 예제코드 CString result; string str = CT2CA(result); istringstream ss(str); string line; int i = 0; while(getline(ss, line, '\n')) { istringstream linestream(line); string cell; getline(linestream, cell, ','); m_list.InsertItem(i, cell.c_str()); int j = 0; while (getline(linestream, cell, ',')) { m_list.SetItem(i, j, LVIF_TEXT, cell.c_str(), NULL, NULL, NULL, NULL); j++; } i++; } '\n' 와 ',' 로 구분하는 형.. 2022. 7. 14.
MFC ] char* -> CString , CString -> char* 변환하기 char* -> CString 변환 char* h1 = "hello"; CString h2 = h1; 그냥 대입해주면 된다 = 연산자 오버로딩이 되어있기 때문이다. CString -> char* 변환 방법1 char* h1 = "hello"; CString h2 = h1; CString w1 = _T("world"); char* w2 = LPSTR(LPCTSTR(w1)); 방법2 CString w1 = _T("world"); char* w2 = w1.GetBuffer(0); 2022. 7. 14.
MFC ] MySQL 을 활용한 도서 관리 프로그램 (1) 깃허브 주소 : https://github.com/joeteo/bookManagerMFCandMysql.git GitHub - joeteo/bookManagerMFCandMysql Contribute to joeteo/bookManagerMFCandMysql development by creating an account on GitHub. github.com 자료 추가 및 선택 행 삭제 기능 구현 먼저 이전에 쓴 글을 참조해서 데이터 베이스를 생성하고 MySQL 라이브러리를 포함 시킨다. 2022.07.13 - [프로그래밍/MFC (C++)] - MFC ] Visual Studio에서 MySQL 라이브러리 추가하기 2022.07.13 - [데이터베이스] - MySQL ] HeidiSQL 기본 사용법 CM.. 2022. 7. 14.
MFC ] 시리얼 통신으로 LED 제어하기 (2) 이전 버전을 개선하였다. 2022.07.09 - [프로그래밍/MFC (C++)] - MFC ] 시리얼 통신으로 LED 제어하기 (1) MFC ] 시리얼 통신으로 LED 제어하기 (1) 깃허브 주소: https://github.com/joeteo/LEDSerialCMD GitHub - joeteo/LEDSerialCMD Contribute to joeteo/LEDSerialCMD development by creating an account on GitHub. github.com https://github.com/joeteo/.. eteo.tistory.com 깃허브 주소: https://github.com/joeteo/MFC_test01.git GitHub - joeteo/MFC_test01 Contri.. 2022. 7. 13.
MFC ] DoModal() 창 닫기, 강제 종료 this->EndDialog(IDCANCEL); 혹은 EndDialog(0); 해도 된다. 중요. 창 종료와는 별개로 할당받은 건 해제해줘야 한다. 참고. Modeless 모달리스 인 경우 창 생성시 DoModal() 대신 Create() 로 다이얼로그 생성하고 닫을 땐 EndDialog() 대신 DestroyWindow() 로 다이얼로그를 닫는다. 참고. 2022. 7. 13.
MFC ] 리스트 컨트롤에서 클릭된 아이템 값 가져오기 1. 클릭된 인덱스 알아내기 리스트 컨트롤 자체의 멤버변수인 .GetSelectionMark(); 을 사용한다. int clickindex = m_list.GetSelectionMark(); 아무것도 안눌렸을 때는 -1 반환 리스트 컨트롤 오른쪽 클릭 후 이벤트 처리 함수 추가 클래스 목록을 주의해서 확인하고 NM_CLICK을 선택한다. 생성된 함수안에 아래와 같이 입력한다. /* void CbookManagerDlg::OnNMClickList1(NMHDR* pNMHDR, LRESULT* pResult) { LPNMITEMACTIVATE pNMItemActivate = reinterpret_cast(pNMHDR); // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다. NM_LISTVIEW* pN.. 2022. 7. 13.
MFC ] Visual Studio에서 MySQL 라이브러리 추가하기 라이브러리는 소스코드를 비공개해 기술 유출은 방지하면서, 공통으로 사용될 수 있는 기능을 모듈화하여 외부와 공유하고 코드의 재사용성을 높이기 위해 존재한다. 또한 컴파일 시간을 단축할 수 있다. 라이브러리는 동적 라이브러리 .dll 과 정적 라이브러리 .lib 가 있는데 메모리를 효율적으로 쓰기 위해선 동적 방식이 좋다. .lib 파일은 링크 단계에서 필요하고 .dll 파일은 실행 단계에서 필요하다. 따라서 동적 방식은 배포할때 실행파일과 함께 배포해야하며 .dll 제작시 .lib도 같이 생성된다. 반면 정적 방식은 해당 .lib파일이 실행파일인 .exe 파일 안에 포함되는 형태이다. 아래는 MySQL 라이브러리를 추가하여 MFC 앱개발을 하기 위한 준비사항 MFC앱 - 대화상자기반 새 프로젝트 만들기 .. 2022. 7. 13.
MFC ] 시리얼 통신으로 LED 제어하기 (1) 깃허브 주소: https://github.com/joeteo/LEDSerialCMD GitHub - joeteo/LEDSerialCMD Contribute to joeteo/LEDSerialCMD development by creating an account on GitHub. github.com https://github.com/joeteo/MFC_test01.git GitHub - joeteo/MFC_test01 Contribute to joeteo/MFC_test01 development by creating an account on GitHub. github.com 첨부된 zip파일에서 필요한 부분을 머지하고 다이얼로그의 도구들과 메시지인 OnReceive와 OnThreadClosed는 직접 추가.. 2022. 7. 9.
MFC ] 통계자료, 스레드 Thread 를 사용하여 로드하기 깃허브 주소 : https://github.com/joeteo/CarAccidentList.git GitHub - joeteo/CarAccidentList Contribute to joeteo/CarAccidentList development by creating an account on GitHub. github.com 무거운 프로세스나 무한루프로 동작해야할 작업이 있다면 쓰레드를 생성해서 백그라운드로 작업을 넘기면 된다. 이전에 만든 교통사고 통계조사 프로그램에서 시간이 오래 걸릴 수 있는 파일 불러오기 부분을 스레드를 사용한 버전으로 수정하였다. UINT Load(LPVOID LpData) { CCarAccidentListDlg* target = (CCarAccidentListDlg*)(LpData.. 2022. 7. 9.
MFC ] 통계자료, 자식 다이얼로그 생성하고 부모 다이얼로그와 상호참조하기 리소스뷰 다이얼로그에서 리소스 추가 다이얼로그 새로 만들기 자식 다이얼로그 ID 바꿔주기 자식 다이얼로그의 클래스 추가 CNewDlg 라는 이름으로 생성하고 기본 클래스는 CDialogEx가 된다. 자식 다이얼로그에도 리스트 컨트롤을 만들고 변수 추가 자식 다이얼로그에는 처음 클래스 생성시 생성자, 소멸자, DoDataExchange 함수밖에 없다. 필요한 경우 가상함수에서 OnInitDialog와 메시지에서 Ondestroy를 추가한다. 부모 다이얼로그 .cpp 파일에서 자식 다이얼로그의 헤더를 추가하고 코드를 작성한다. 자식 다이얼로그 클래스를 생성하고 자식에게 부모 다이얼로그의 포인터를 넘겨주고 키워드 검색결과가 담긴 벡터를 주소로 넘긴 후 DoModal() 을 호출하여 새 창을 연다. Modal .. 2022. 7. 8.
MFC ] new 로 동적할당 한 건 창이 닫히기 전에 OnDestroy() 에서 delete로 해제하기 생성자에서 동적할당한건 소멸자에서 해제하면 될텐데 생성자가 아닌 곳에서 동적할당 한 것인데 할당해제할 시기가 마땅치 않은 경우 창이 닫히기 전에 해제하면 다음과 같이 해제하면 메모리 누수를 막을 수 있다. 프로젝트 - 클래스 마법사 해당되는 다이얼로그에서 메시지, WM_DESTORY 를 추가한다. 아래와 같이 OnDestory() 함수 안에 new 로 동적할당 한 것을 모두 delete 하는 코드를 추가한다. 큰 의미는 없지만 delete 후에 .clear() 까지 해줬다. void CCarAccidentListDlg::OnDestroy() { if (DC.getList().size() != 0) { for (int i = 0; i < DC.getList().size(); i++) { delete DC... 2022. 7. 6.
MFC ] CString -> string 변환, string-> CString 변환 CString -> string변환 CString cstr = _T("hello"); string str = CT2CA(cstr); string -> CString 변환 string str = "HELLO"; CString cstr; cstr = str.c_str(); 참고로 이거는 CString 타입을 선언 동시 초기화로 변환하면서 대입할 수가 없어서 위에처럼 단계를 거쳐서 했다. 2022. 7. 4.
MFC ] 통계 데이터 List Control (리스트 컨트롤) 에 로드하기 Data.h #pragma once #include #include using namespace std; #define COLUMN_NUMBER 13 #define LOCATION_NUMBER 11 class Data { private: CString siDo; CString siGunGoo; int accidentCount[LOCATION_NUMBER]; public: Data(string _siDo, string _siGunGoo, string* _accidentCount); CString& GetSiDo(); CString& GetSiGunGoo(); int GetAccidentCount(int idx); }; Data.cpp #include "pch.h" #include "Data.h" Data:.. 2022. 7. 4.
MFC ] Class 를 이용한 음료수 자판기 Drink.h #pragma once #include using namespace std; class Drink { public: CString name; int price; int stock; public: CString getName() const; void setName(const CString& name); int getPrice() const; void setPrice(int price); int getStock() const; void setStock(int stock); }; 멤버변수는 다 private으로 하고 getter, setter를 만들어 두었다. Drink.cpp #include "pch.h" #include "Drink.h" CString Drink::getName() const.. 2022. 7. 4.
MFC ] CString -> int 변환, int -> CString 변환 CString -> int 변환 CString m_val1 = _T("1234"); int temp=0; temp = _ttoi(m_val1); int -> CString 변환 int result = 4321; CString m_result; m_result.Format(_T("%d"), result); 2022. 7. 2.
MFC ] 간단한 음료수 자판기 + Static Text 글씨 크기 키우기 + 버튼 캡션 개행(\n)하기 해당 Static Text의 ID를 변경하여 특정하고 OnInitDialog()에 다음 내용 추가 CFont font; LOGFONT logfont; ::ZeroMemory(&logfont, sizeof(logfont)); logfont.lfHeight = 18; font.CreateFontIndirect(&logfont); GetDlgItem(IDC_STATIC_TITLE)->SetFont(&font);; font.Detach(); 버튼 캡션에 개행 넣기 // VDMachineDlg.h: 헤더 파일 // #pragma once #define COLA_PRICE500 #define CIDAR_PRICE600 #define FANTA_PRICE700 #define WATER_PRICE400 // CVDMa.. 2022. 7. 2.
MFC ] 간단한 계산기 + 라디오 버튼 체크상태 확인하기 라디오 버튼 체크상태 확인하기 ((CButton*)GetDlgItem(IDC_RADIO1))->GetCheck() // SimpleCalDlg.h: 헤더 파일 // #pragma once // CSimpleCalDlg 대화 상자 class CSimpleCalDlg : public CDialogEx { // 생성입니다. public: CSimpleCalDlg(CWnd* pParent = nullptr);// 표준 생성자입니다. // 대화 상자 데이터입니다. #ifdef AFX_DESIGN_TIME enum { IDD = IDD_SIMPLECAL_DIALOG }; #endif protected: virtual void DoDataExchange(CDataExchange* pDX);// DDX/DDV 지원입니.. 2022. 7. 2.
MFC ] 새 프로젝트 만들기, 환경설정 비주얼 스튜디오에서 새 프로젝트로 MFC앱을 선택하고 없으면 '추가 도구 및 기능 설치'를 한다. 애플리케이션 종류는 대화 상자 기반 선택 C++ 개발환경으로 바꾸기 나중에 다시 일반 설정으로 돌아갈 수 있다. 화면 오른쪽에 자주 쓰는 도구상자와 속성 도킹해두기 리소스 뷰 아래 경로 또는 리소스파일.rc를 클릭해 GUI를 볼 수 있다. 2022. 7. 2.
C++ ] 이중 포인터와 포인터 배열의 차이 이중 포인터 #define _CRT_SECURE_NO_WARNINGS #define _CRTDBG_MAP_ALLOC #include #include int main() { int** pptr; pptr = new int* [4]; pptr[0] = new int[4]; pptr[1] = new int[2]; pptr[2] = new int[5]; pptr[3] = new int; delete[] pptr[0]; delete[] pptr[1]; delete[] pptr[2]; delete pptr[3]; delete[] pptr; _CrtDumpMemoryLeaks(); return 0; } 포인터와 배열은 서로 호환적이다. 그래서 이중 포인터를 이차원 배열로 본다면 행과 열을 가변적으로 둘 수 있는 이차.. 2022. 6. 28.
C++ ] 교통사고 통계자료 필터 프로그램 (2) - vector 사용 , 파입입출력 깃허브 주소 : https://github.com/joeteo/CarAccident main.cpp #include #include "AccidenData.h" #include "AccidentList.h" #include enum { PRINTLIST = 1, SUBTOTAL, EXIT }; using namespace std; int main() { AccidentList handler; handler.readListFromFile(); while(1) { system("cls"); int select; handler.DispMenu(); cin >> select; switch(select) { case PRINTLIST: handler.searchList(); break; case SUBTOTAL:.. 2022. 6. 28.
C++ ] 2021 교통사고 통계자료 필터 프로그램 (1) + 파일 입출력 부분합 기능까지 구현하였다. main.h #pragma once #define COLUMN_NUMBER 13 #define ROW_NUMBER 229 enum { PRINTLIST=1, SUBTOTAL, EXIT }; main.cpp #include #include "AccidenData.h" #include "AccidentList.h" #include "main.h" #include using namespace std; int main() { AccidentList list; list.readListFromFile(); while(1) { system("cls"); int select; list.DispMenu(); cin >> select; switch(select) { case PRINTLIST:.. 2022. 6. 28.
C++ ] 상속을 이용한 주차타워 이전에 사용한 동물호텔과 코드가 거의 같다. main.cpp #include #include "Parking.h" #include using namespace std; int main(void) { Parking parkingHandler; while (true) { int select; system("cls"); parkingHandler.DispMenu(); cout > select; switch (select) { case INBOUND: parkingHandler.InBound(); break; case OUTBOUND: parkingHandler.OutBound(); break; case VIEW: parkingHandler.ViewList(); break; case EXIT: cout 2022. 6. 24.
C++ ] 상속/가상함수를 이용한 동물호텔 main.h #include #include "Hotel.h" #include using namespace std; int main(void) { Hotel hotelHandler; while(true) { int select; system("cls"); hotelHandler.DispMenu(); cout > select; switch (select) { case CHECKIN: hotelHandler.CheckIn(); break; case CHECKOUT: hotelHandler.CheckOut(); break; case VIEW: hotelHandler.ViewList(); break; case EXIT: cout 2022. 6. 24.
C++ ] 입력 버퍼 비우기 , 문자를 입력하면 무한루프에 빠지는 문제 해결 / cin.clear() , cin.ingnore() 정수형 값이 입력되어야 하는데 문자나 문자열이 들어왔을 때 무한루프에 빠지는 문제를 해결하는 방법은 다음과 같다. 대략 아래와 같이 추가해주면 된다. cin.clear() 는 현재 입력이 성공인지 실패인지 나타내는 내부 플래그를 초기화시키는 함수이고 cin.ignore() 가 입력 버퍼를 비우는 함수이다. 두번째 매개변수인 '\n' 문자가 나올때까지 비우는 것(해당 문자 포함)이고, 첫번째 매개변수는 byte 단위로 무시할 문자의 최대 개수를 뜻한다. 정석은 std::numeric_limits::max()을 쓰는 것인데 너무 기니까 INT_MAX를 쓰거나 적당히 큰 값을 입력해주면 된다. cin.clear(); cin.ignore(1000,'\n'); 문자가 입력된 경우를 예외처리 하지 않았을 때 아래와.. 2022. 6. 16.