'MINERVA'에 해당되는 글 97건
- 2022.04.18 :: [C/C++] strtok, strtok_s crash
- 2022.04.18 :: [c/c++] const 키워드 이해
- 2022.03.05 :: [패키지관리자] 개발 언어별, OS별 패키지 관리자 정리
- 2022.02.18 :: [sound] FxSound 강추
- 2022.01.16 :: [정보] "새 볼륨" 볼륨은 다시 마운트 할 수 없음
- 2022.01.01 :: [펌] 속도 비교: Python vs C/C++ vs Assembly
- 2021.12.19 :: [QT] qt 라이브러리 설치
- 2021.11.26 :: [vcpkg] boost 설치 및 사용 예제
- 2021.11.19 :: [에러] 'atlbase.h': No such file or directory
- 2021.11.19 :: [메모리 기본값] 메모리 가비지(?)
아주 오래전에 이와 유사한 이슈가 있었는데, 깜빡하고 똑같은 실수를 했음
개인적으로는 msdn에 해당 내용이 좀더 친절하게 되어있으면 좋겠다.
https://stackoverflow.com/questions/40034176/strtok-s-crashes-program-when-string-is-of-char
해당 이유는 아래와 같이 정리가 되어있음.
" strtok() changes the memory pointed to by the argument str, so what it points at must be writeable - i.e. a char * and not a const char *. Since in the second case this condition is not satisfied, when it attempts to write a NUL to the read-only memory it crashes."
간단하게 정리하면, strtok_s(strtok)함수의 첫번째 인자에 상수포인터(pointer to const)가 들어가면 않됨
즉, 포인터가 가르키는 address가 read-only이면 않됨
[참조]
https://choiwonwoo.tistory.com/entry/cc-const-%ED%82%A4%EC%9B%8C%EB%93%9C-%EC%9D%B4%ED%95%B4
const 키워드는 개발중에는 자연스럽게(?)사용하다가, 질문을 받고 설명하려고 하면 은근히 까다롭게 느껴져정리를 하고자 합니다. 개발자마다 설명하는 방법이 여러가지 있을 수 있지만, 저의 경우는 아래 개념으로 이해를 하고 있습니다.
1. const(constant) 키워드란?
- 상수로 만든다, 변경할수 없게 만든다.
- 변수 또는 포인터 변수를 상수로 만든다. --> 변수의 상수화
- const를 사용한 변수는 반드시 초기화 되어야 함(생각해 보면 당연함!)
2. 어디에 위치하는가?
- https://www.geeksforgeeks.org/memory-layout-of-c-program/
- const 키워드를 가진 변수는 반드시 초기화 되어야함
- Data Segment(아래 3가지 형태로 분류)에 저장됨:
1) .DATA 영역: 변수를 초기화한 상태 저장
2) .BSS 영역: 변수를 초기화하지 않은 상태 저장
2) .RODATA 영역 : 읽기 전용 데이타 (예: const char* string="hello")
--> 참고: 세크먼트 분류: CODE(TEXT), DATA, HEAP, STACK)
3. 용례
1) const int 과 int const 는 같은 의미
- 상수 int := int 상수
- const int a; // 에러 발생: const는 반드시 초기화 되어야 함
- cont int a = 10;
a = 11; // 에러발생: 상수화된 변수 내용은 변경 불가
2) const vs 포인터 변수: 4가지 조합이 가능함
- 이 문법은 아차하면 헷갈림
a) const int *pointer: 상수 포인터
- int형 상수에 대한 포인터(pointer to int const)
- 포인터 대상 or 내용을 상수화시킴
- 포인터 변수 주소 변경가능, 포인터 대상/내용 변경 불가
- const int *pointer 해석(?): int가 const이다. 그래서 내용이 변경 불가이고, 포인터 자체는 변경이 가능합
- 예:
int nValue1 = 100;
int nValue2 = 200;
const int *pnVar1 = &nValue1;
pnVar1 = &nValue2; // 성공
*pnVar1 = 500; // 에러발생:const인 변수에 할당할 수 없습니다.
b) int const * pointer:
- int형 상수에 대한 포인터(pointer to const int)
- const int *piointer와 같은 표현
c) int * const pointer: 포인터 상수
- (주소를 가지는) 포인터 그 자체를 상수화 시킴
- int형에 대한 포인터 상수(const pointer to int)
- 주소는 변경 불가, 그러나, 포인터 변수가 가르키는 내용은 변경이 가능
- int * const pointer 해석(?): pointer가 상수이므로 변겨이 불가, 그러나, 포인터가 가르키는 내용은 변경가능
-예:
int nValue1 = 100;
int nValue2 = 200;
int *const pnVar1 = &nValue1;
pnVar1 = &nValue2; // 에러
*pnVar1 = 500; // 성공.
d) const int const *pointer
- 상수를 가리키는 상수 포인터
- int 형 상수에 대한 포인터 상수(const pointer to const int)
- 주소, 값 모두 변경 불가
- int const * const pointer는 같은 표현
int nValue1 = 100;
int nValue2 = 200;
int *const pnVar1 = &nValue1;
pnVar1 = &nValue2; // 에러
*pnVar1 = 500; // 에러
[직관적으로 정리]
# const 다음에 오늘 타입/내용은 변경 불가
# 예: int function(const char* list);
--> 함수의 경우 call by reference를 통해 값은변경하지 않고, 연결되는 주소만 바꾸어서 사용하기 위함이다.
최근 Python을 주 언어로 하는 프로젝트를 완료하고, 진행 중 정리를 해야겠다는 내용을 오늘에서야 정리합니다.
개인적으로 약 20년 넘게 개발을 하면서, 프로젝트의 특성에 따라 적절한 개발 언어, 기술, 그리고 툴을 선택 또는 학습하고 진행하고 있습니다.(C/C++,C#, JAVA, Javascript, Python, PHP, Solidity etc)
하지만, 언제 부터인지는 기억이 나지 않지만(개인적인 경험에는 java가 처음이었던 것 기억됨), 최근 언어마다 다양한 pakage manager가 지원되고 있어, 협업을 위해서 패키지 관리자 부분도 프로젝트 초기에 가볍게(?) 이야기 되고 있습니다. 그래서, 간단하게 해당 내용을 정리하였습니다.
1. Pakage manager란?
- 프로그래밍 언어적인 측면에서는 프로젝트(개발)의 환경을 쉽게 만들어주고, 편리하게 관리하기 위한 도구라고 보면됩니다. (이러한 도구(?)가 없다면, 프로젝트 시작전에 각 모듈의 유효한 dependecy등을 수작업으로 해주어야 함)
- 시스템 어드민 측면에서는 시스템에 패키지(소프트웨어)의 다운로드, 설치 그리고 관리를 의미하였습니다.
2. 각 언어별 Pakage manager
1) Java - Maven, Gradle 이 있지만, 현재는 Maven이 주를 이루고 있음
2) JavaScript - npm
3) C# - nuget
4) C/C++ - vcpkg(https://choiwonwoo.tistory.com/entry/vcpkg-Please-install-the-English-language-pack?category=267468)
5) PHP - Composer
6) Python - pip, pypi, poetry
3. OS 별 Pakage manager
1) Mac: Homebrew
2) Debian: dbpkg, apt
3) Redhat: rpm, yum
4) Window: winget(https://docs.microsoft.com/ko-kr/windows/package-manager/winget/)
4. 정리
- 아주 초기에는 일일이 라이브러리를 다운받아 설치를 하여, 테스트하고 패스등의 설정을 하였지만, 근래 개발에서는 가능한 패키지 관리자를 통해서, 일관되게 관리 하여 생산성과 효율을 높이고자 합니다. 하지만, 너무 편해지다 보면 기초적인 라이브러리의 설정을 어려워하는 쥬니어 개발자를 가끔 보게 되면서 놀라곤 합니다. 아주 가끔은 한땀, 한땀 설정및 빌드를 하면서 테스트 코드 및 library version dependency 문제등을 경험하다 보면, 예상치 못한 가치와 경험이 쌓이곤합니다.
제 기억이 분명히 유료였던것으로 기억하는데, 공짜로 풀렸네요.
꼭 설치해서 사용해보세요. 정말로 소리가 다른것을 느끼실수 있어요.
# 절대강추 #무료
NTFS형식 외장형 하드를 Mac계열 PC에서 사용할때 가끔 발생합니다.
원은은 정상적으로 외장형으로 unmount하지 않아서 발생한다고 하는데..원인은 추가적으로 더 있는것으로 보입니다.
이 에러가 발생하면 제가 알고 있기로는 Mac PC에서는 해결을 할수 없습니다.
윈도우 PC에서 아래와 같이 작업을 작업을 진행하시면 됩니다.
>chkdsk /F [외장하드 드라이므];
10년전에는 Java와 Python과 같은 인터프리터(interpreter)언어에 대한 속도 문제(?)에 대해서 이슈가 되었지만, 최근에는 이러한 내용이 크게 이슈(^^)가 되지 않고 있습니다. 그 이유는 여러가지가 있지만, 개인적으로 하드웨어의 성능과 개발에 대한 Quality를 평가하는 부분이 많이 바뀌었기 때문입니다.
그래도 아래의 영상은 한번씩은 한번씩 보는 것이 좋을 듯합니다.
https://www.youtube.com/watch?v=3PcIJKd1PKU
1. qt 설치
몇년전만 해도 qt 라이브러리는 용량도 어마어마하게 크고, 소스를 통해서 빌드할때 많은 시간을 들여야 했습니다.
하지만 이제는 라이브러리를 개발하면서, 배포부분도 많은 배려를 해주고 있어 쉽게 됩니다.
(* 하지만 여전히 소스 빌드를 필요로 하는 부분도 있습니다.)
1) 적절한 설치 파일 선택
1) https://download.qt.io/official_releases/
위 디렉토리에서 online_installers를 선택후, 윈도우 설치 파일을 다운로드
2) 설치 시작
참고:
vcpkg에 대한 사용 예제를 메시지로 부탁하신 분이 있어서 정리를 하여 보았습니다
1) boost 다운로드
- 64 bit dynamic: vcpkg install boost:x64-windows
- 64 bit static: vcpkg install boost:x64-windows-static
2) boost 확인
- vcpkg list
3) boost를 visual studio에 연결(?)
위에 설명이 된대로, boost라이브러리를 사용시, 별도의 include와 libraray path설정없이 이제 바로 사용가능함
4) boost를 활용한 예제
- 쓰레드를 생성하는 예제 #include <iostream> #include <typeinfo> #include <thread> #include <boost/thread.hpp> using namespace std; void myTest() { thread::id t_id = this_thread::get_id(); cout << "thread called: " << typeid(t_id).name() <<' '<< sizeof(t_id) << 'T:' << t_id << endl; } int main() { //-- cout << "thread calling" << endl; //-- 쓰레드 생성: 4개 T1~T4 boost::thread workerThread1(myTest); boost::thread workerThread2(myTest); boost::thread workerThread3(myTest); boost::thread workerThread4(myTest); //-- 각 쓰레드 작업 완료 대기 workerThread1.join(); workerThread2.join(); workerThread3.join(); workerThread4.join(); cout << "thread done" << endl; } |
- 개발 작업을 할때, 별도의 라이브러리와 관련된 작업을 할필요가 없다.(include, library path...)
그리고, 제일 좋은 점은 개발에 사용된 라이브리를 자동으로 실행파일 위치에 복사여준다는 부분이 최고로 편함.
(이제는, XCOPY ...어쩌구 하는 작업을 하지 않아도 된다. 만세!!!)
감사합니다.
개발 PC를 새로 장만 후, 작업 프로젝트의 소스를 다시 빌드시 아래와 같은 에러가 발생하여 잠시 당황하였다가 기억을 더듬어 다음과 같이 처리하였습니다.
[에러화면]
C:\Program Files (x86)\Windows Kits\10\include\10.0.17763.0\um\sphelper.h(51): fatal error C1083: 포함 파일을 열 수 없습니다. 'atlbase.h': No such file or directory
[해결]
아래의 값은 컴파일러에 의해서 세팅되는 메모리 값입니다.
(*가급적 모든 변수/메모리는 반드시 초기화하는 습관을 가지는것이 제일 듯합니다.)
- 64 bits
[초기화 되지 않은 지역변수]
0xCCCCCCCCCCCCCCCC
[초기화 되지 않은 Heap 메모리]
0xCDCDCDCDCDCDCDCD
[Free된 Heap 메모리]
0xDDDDDDDDDDDDDDDD or 0xFEEEFEEEFEEEFEEE
[할당된 Heap 메모리를 벗어난 공간]
0xFDFDFDFDFDFDFDFD
- 32 bits
[초기화 되지 않은 지역변수]
0xCCCCCCCC
[초기화 되지 않은 Heap 메모리]
0xCDCDCDCD
[Free된 Heap 메모리]
0xDDDDDDDD or 0xFEEEFEEE
[할당된 Heap 메모리를 벗어난 공간]
0xFDFDFDFD
추가 도움 내용: