VisualStudio.C++.C#/C . C++ ( 31 ) std::shared_mutex . 멀티 스레드 읽기 쓰기 락 std::shared_mutex . 읽기 쓰기 락 - C++ 17 부터 제공됨 #include class MyClass {private: std::shared_mutex rw_mutex; // 읽기-쓰기 락 객체 MyStruct data; // 보호할 구조체 변수public: void UpdateData(const MyStruct& newData) { std::unique_lock lock(rw_mutex); // 쓰기 잠금 data = newData; } MyStruct ReadData() { std::shared_lock lock(rw_mutex); // 읽기 잠금 return data; }}.. 2024. 9. 12. C/C++ . 부호 있는 정수 singed int . 음수 표현 규격 . 2's complement signed int 최상위 바이트 메모리 표현 규격 int8_t , int32_t , int64_t 등에서 음수 양수를 메모리에 표현하는 규격 양수 : 최상위 바이트의 최상위 비트 = 0 음수 : 최상위 바이트의 최상위 비트 = 1 singned int 의 최상위 바이트 비트 7 비트 6 비트 5 비트 4 비트 3 비트 2 비트 1 비트 0 1 : 음수 0 : 양수 연관 각종 AD 변환 칩들의 변환 포맷이 2's complement 가 많다. AD 변환값을 signed int 형으로 받아서 활용하면 된다. ADS1285 . 32비트 ADC ADS1285 ADC는 저잡음 정밀 디지털화 및 확장된 배터리 실행 시간이 필요한 지진학 장비의 까다로운 요구 사항을 위해 설계되었습니다. 저잡음 PGA를 사용하면 외.. 2023. 8. 27. C/C++ . volatile 변수 volatile 변수 선언 형식. volatile uint8_t ui8_v; // 변수 ui8_v 가 volatile 이 됨. uint8_t volatile ui8_v 로 해도 동일하나 일관되게 volatile 을 가장먼저 기록해 volatile uint8_t * pui8_v; // 포인터 변수 pui8_v 의 대상이 volatile 이 됨. uint8_t * volatile pui8_v; // 포인터 변수 pui8_v 자체가 volatile 이 됨. volatile uint8_t * volatile pui8_v; // 포인터 변수 pui8_v 자체와 pui8_v의 대상 모두 volatile 이 됨. volatile 변수 선언 의미 - volatile 로 선언된 변수들은 컴파일러가 최적화 하지 않는다. .. 2023. 3. 10. C++ template (템플릿), 변수, 함수, 클래스 템플릿. 제네릭 타입. 개요. C++ template C++ template C++ 언어의 기본 요소. 클래스, 함수, 변수가 제네릭타입 (Generic Type) 으로 동작하게 하는것. - 클래스 템플릿 : 클래의 멤버변수를 template 로 선언했다는 의미. - 함수 템플릿 : 함수의 인자, 반환값을 template 으로 선언 했다는 의미. - 변수 템플릿 : 변수를 template 로 선언했다는 의미. 제네릭타입으로 선언된 것이 실제 사용될 자료형으로 되는것은 컴파일 시점에 이뤄진다. 즉, 컴파일러가 코드에서 사용된 특정 자료형별로 지가 알아서 추가 코드 작성해주는 것. 유용성. 자료형이 달라진 것은 추가 코드 작성하지 않아도 된다. 연산자오버로딩,다중상속시 간편하다. 추가정보. 1. 위키백과 : 템플릿(C++) tem.. 2020. 9. 15. C/C++. 실수 , 올림 내림 반올림 , ceil floor round #include // for c #include // for c++ ceil(2.8); // 반환값 3 floor(2.8); // 반환값 2 round(2.8); // 반환값 3 . C++ 11 부터 지원됨. round(2.4); // 반환값 2 ceil(-2.8); // 반환값 -2 floor(-2.8); 반환값 -3 round(-2.8); // 반환값 -3 . C++ 11 부터 지원됨. round(-2.4); // 반환값 -2 round - nearest integer value std::round, std::roundf, std::roundl, std::lround, std::lroundf, std::lroundl, std::llround, std::llroundf - cppreference.com.. 2020. 5. 26. C++. std::map . 키-값 컬렉션 #include /// 선언 std::map my_map_i_str; /// 요소추가 예. 키=3, 값 igotit my_map_i_str[3] = std::string("igotit"); /// 요소추가 my_map_i_str.insert(std::pair(3,std::string("igotit"))); /// 요소제거 my_map_i_str.erase(3); // 요소 모두제거 my_map_i_str.clear(); /// 요소받기 std::string my_str = my_map_i_str[3]; std::string my_str = my_map_i_str.at(3); /// 요소수량 받기. my_map_i_str.size(); /// 비어있나 점검. my_map_i_str.empty(); // 요.. 2020. 4. 1. C/C++. 윈도우. 파일 저장, 읽기 . FILE . fopen, fprintf, fscanf 파일 저장하기 void save_file() { FILE* fp; float mydata[100]; fp = fopen("test.txt","w"); // 파일열었음.인자1 파일명. 인자2 w 의미 기록용도. for (int idx = 0; idx < 100; idx++) { fprintf(fp, "%f\n", mydata[idx]); } fclose(fp); } 파일 읽기 void read_file() { FILE* fp; float mydata[100]; fp = fopen("test.txt","r"); // 파일열었음.인자1 파일명. 인자2 r 의미 읽기용도. for (int idx = 0; idx < 100; idx++) { fscanf(fp, "%f\n", &mydata[idx]); } fclo.. 2020. 3. 29. C++ REST SDK. Json 형식 다루기 . 개요 C++ REST SDK 기반 Json 형식 만들기, Json 형식 데이터 에서 데이터 요소(키-값) 추출하기. Json 형식 만들기 object 를 바로 json value 형식으로 변환. #include // need for json // Json 형식 {"op":"ping"} 만들기. 키-값 1개만 있는 초간단. 아래처럼 하면됨. web::json::value obj = web::json::value::object(); obj[U("op")] = web::json::value::string(U("ping")); std::wcout wstring형변환. s 2020. 3. 22. C/C++. C 에서 C++ 함수 호출하기. extern "C" 선언. C++ 에서 C함수 호출. C 에서 C++ 함수 호출 C와 C++ 코드들이 혼재된 프로젝트에서 C++ 에서 정의된 함수를 C 에서 호출하는 방법. C++ 측에 C에 노출시킬 함수에 extern "C" 선언 추가된것은 C에서 호출가능함. /// C++ mycpp.cpp 측 코드. void function(void) { } //상기 함수를 C측에 노출시키는 함수 추가 작성. extern "C" void c_function(void) { function(); } // C++측 헤더 파일 mycpp.h 에는 위 함수 선언 추가하지 않는다. // extern "C" void c_function(void); f1(_i); } /////////// C code double call_my_class_f1(struct my_class * _p_m.. 2020. 1. 24. C. C++. 메모리 직접 접근 메모리 주소 ( 예. 0xF000F100 등 아무거나 시스템에서 메모리 주소로 사용하고 있는 것 ) 에 직접 접근하여 값 uint32_t 값 기록하는 방법. 임베디드 시스템 이라면 메모리 주소는 GPIO 포트 출력 설정하는 레지스터 주소일수도있고, 플레시 메모리 영역일수도 있다. // 코드 의미. 주소에 해당하는 숫자를 uint32_t 포인터로 처리하고 그것의 값 * 에 0xFF 대입하라. // volatile 은 컴파일러 (특히 GCC) 의 최적화 옵션 적용하지 말라는 설정. 코드에 기록된 그대로 컴파일 하라는 의미. *((volatile uint32_t *) 0xF000F100 ) = 0xFF; // 매번 위 구문 타이핑 하기 번거로우니 매크로로 정의하면 사용하기 편리하다. #define MEM_LE.. 2020. 1. 20. C/C++. & 와 * 메모리 접근 형변환 uint32_t ui32 = 26584; uint8_t ui8[4]; ////32비트 정수 ui32 를 8비트 정수배열에 배치하기. uint8_t * pui8 = (uint8_t*)&ui32; // ui32 의 주소를 uint8_t 포인터 형으로 받고. ui8[0] = *(pui8+0); ui8[1] = *(pui8+1); ui8[2] = *(pui8+2); ui8[3] = *(pui8+3); ///// ui8[0],[1],[2],[3] 개별적으로 분리된 것을 다시 32비트 정수 1개로 변환하기. //// ui8[0] + 2^8*ui8[1] + 2^16*ui8[2] + 2^24*ui8[3] 2020. 1. 13. C/C++. 구조체 변수 선언 동시 멤버 초기화 typedef struct { uint8_t UI8[4]; float f; uint32_t UI32; }ST_T1; ///// 위 타입선언된 구조체 자료형으로 구조체 변수 선언 시점에 바로 멤버변수 초기화 가능. ST_T1 myST_T1 = { .UI8[0] = 20, .UI8[1] = 30, .f = 2.3, }; 첫 등록 : 2020-01-10 최종 수정 : 단축 주소 : https://igotit.tistory.com/2439 2020. 1. 10. C, C++. 상수 2진수 , 16진수 16진수 - 숫자앞에 0x부착. 예 . 0xAC 16진수 이므로 0,..,9,A,B,C,D,E,F 로만 구성. 소문자로 해도됨. - 16진수 표현 문법은 모든 C, C++ 컴파일러에서 동일하여 완전한 표준으로 생각해도됨. 2진수 - 숫자앞에 0b 부착. 예. 0b10010001. 2진수이므로 1과0으로만 구성. - C++ 14 에서는 가독성 향상 목적으로 구분자' 사용해도됨. 예 : 0b1000'0001 - 원래 C 언어에는 2진수 표현 표준규격없었음. - 컴파일러마다 0b 를 2진수로 처리가능한 경우도 있고, 아닌 경우도 있음. - gcc 에서는 0b 가능. KEIL MDK-ARM 에서는 0b 모름. 2진수 표현 위한 마크로 - 모든 C 컴파일러에서 사용가능하려면 아래 코드예처럼 마크로 이용해도 된다... 2020. 1. 3. C/C++. 메모리 스택, 힙,지역변수, 동적 메모리 할당. stack, heap, new, delete 스택(Stack), 힙(Heap) C/C++ 에서의 스택이니, 힙이니 하는 것들은 C/C++ 컴파일러에서 메모리 핸들링 하는 것에 대한 기능적 메모리 구분 명칭. (타겟 시스템에 하드웨어적으로 스택, 힙 영역의 메모리가 따로 있는 것 아님) Stack 1. 프로그램의 "함수내"에서 선언된 지역변수(자동변수) 저장되는 메모리. 2. 함수가 끝나면 stack 에 저장된 것은 프로그램 코드에서 명시적 제거 처리 하지 않아도 자동 삭제됨. Heap 1. 프로그램에서 "동적 생성"한 경우 Heap 에 저장됨. - 동적 생성이란, new, malloc 함수 등으로 메모리 할당하는것을 의미함. 2. Heap 에 생성된 메모리는 자동 삭제되지 않음. 프로그램내에서 명시적으로 제거처리(delete, free 등) 해야 .. 2019. 12. 28. C/C++. 구조체 메모리 동적 할당. malloc , free 개요 // 정적 구조체 배열 생성예. typedef struct _st1 { uint8_t ui8Arr[100]; }ST_T1 ST_T1 myST_T1[5][9]; // 구조체 ST_T1 을 2차원 배열 5x9 짜리로 생성하는것. 위와 같은 정적 생성 방식의 구조체 배열 생성하지 않고 동적 생성하는 방법 정리. 1. 구조체 멤버만 동적 생성예. 2. 구조체 배열만 동적 생성예. 3. 구조체 멤버 및 배열 모두 동적 생성예. 1. ST_T1 의 멤버 1차원 배열만 동적생성 예. 상기와 같은 정적 방식으로 구조체 2차원 배열로 만든것과 달리, ST_T1 의 1차원 배열 uint8_t ui8Arr[100] 처럼 고정 사이즈 100 이 아닌 동적 임의 사이즈 배열 생성가능한것을 멤버로 가지면서, ST_T1 의 .. 2019. 12. 28. C/C++. #error. 컴파일시 사용자 지정 오류 메시지 출력 하고 컴파일 종료 #if !defined(THEPARA) // THEPARA 가 #define 되어있지 않다면, #error THEPARA define needed // 컴파일시 이 문구가 표현되고 컴파일 종료됨. #endif 첫등록 : 2019년 10월 22일 최종수정 : 본 글 단축주소 : https://igotit.tistory.com/2349 2019. 10. 22. C/C++. #define. #, ## 등 #define 에서 사용되는 ## 과 # ## : 토큰 합치는것. /// ## 사용예 #define myDEFINE_INTIDX(idx) int myint ## _idx void main() { myDEFINE_INTIDX(0); // int myint_0; 과 동일. myDEFINE_INTIDX(1); // int myint_1; 과 동일. } # : 토큰에 " " 해주는것. 즉 문자열로 처리되게 하는것 ///// # : 문자열로 변환하는것 #define myPrint(para) printf(#para) int main() { // 문자열 출력을 의도한건데 "" 없이 사용해도 // #define myPrint(para) printf(#para) 의하여 // 결국 printf("Hello"); 가 실행되.. 2019. 10. 22. C/C++. const int * , int const *, int * const, int * const const C/C++에서 const int my_int; // 일반변수는 선언과 동시에 초기화 안해도 됨. const int my_c_int = 1; // const 는 선언과 동시에 초기화 해야함. int * my_p_int; // my_p_int는 일반포인터변수이므로 초기화 안해도 됨. /* const int * (이것과 int const * 는 같은의미) const int 의 포인터변수 선언시 사용됨. 즉, 아래 선언처럼 하면 my_p_c_int 는 const int 인것의 포인터변수. */ const int * my_p_c_int = &my_int; // 틀림. my_p_c_int 는 const int 인것의 포인터 변수여야 함. const int * my_p_c_int = &my_c_int; //가능. m.. 2019. 10. 21. 이전 1 2 다음