본문 바로가기

운동하는 개발자/c++

(19)
C++로 Windows 환경에서 코드 동작 시간 체크 (feat. GetTickCount64의 오류) 코드를 작성하여 테스트하던 중 생각보다 속도가 느려서 어디서 시간이 딜레이되는지 확인해야 하는 경우가 종종있다. 기존 사내 프로젝트 전임자의 코드에서 GetTickCount64()를 쓴 흔적이 있길래 그대로 사용하여 로그를 찍어봤더니 대부분의 코드에서는 0ms으로 찍히나 일부 로그가 15~17ms로 찍히는것이 확인되었다. 대부분 같은 구간에서 찍혀서 해당 시간이 실제인줄 알았으나... GetTickCout64()는 IRQ(Interrupt Request) 즉 인터럽트 처리 시간이 발생하여 해당 로그가 찍힌것이였다. 이후 찾아보니 GetTickCout64()는 20ms이내의 수행시간일 경우 오차범위가 존재하였다. 나는 초당 60프레임의 비디오 데이터를 처리하는 로직을 테스트 중에 있었기에 16ms이내의 시..
Visual studio Stack overflow (Stack Reserve Size) 타 팀의 요구하상으로 간단한 툴을 만들어서 전달해 주려는데 특정 함수 진입 시 Stack overflow가 나면서 프로그램이 종료되었다. 그동안 경험에 의해서는 보통 호출하는 쪽에서 정리안된 메모리가 충돌한다던가 하는 문제였었기에 호출하는 쪽만 죽어라 찾아봤는데 아무리 봐도 원인을 찾을 수 없었다. 그래서 혹시나 싶어 호출 되는 함수에서 특정 기능들을 하나씩 지워가며 테스트해본 결과 char 배열의 선언을 지우니 정상작동했다. ?????????? GPT에서도 해당 코드는 문제가 없다고 하는데.. 찾아보니 visual studio에서 제공하는 stack의 크기는 디폴트로 1MB였던것이다 아래 예시코드처럼 작성하게되면 해당 에러가 발생하게 된다 이 설정은 프로젝트 옵션에서 Linker-> All Option..
Beakjoon] 절댓값 힙 구현하기 (백준 11286 코테) = 우선순위 문제주소 : https://www.acmicpc.net/problem/11286 11286번: 절댓값 힙 첫째 줄에 연산의 개수 N(1≤N≤100,000)이 주어진다. 다음 N개의 줄에는 연산에 대한 정보를 나타내는 정수 x가 주어진다. 만약 x가 0이 아니라면 배열에 x라는 값을 넣는(추가하는) 연산이고, x가 0 www.acmicpc.net 풀이 : 연산의 개수때문에 O(n^2의 연산속도의 알고리즘으로 해결하면 안된다. O(nlogn) 시간복잡도의 알고리즘으로 풀어야 하며 값을 입력받으면서 바로바로 조건에 맞게 정렬시켜야 한다. 우선순위 큐를 이용하되 순서의 조건이 까다롭기에 조건을 직접 알려줘야한다. 코드는 아래 숨김 더보기 #include #include #include struct MyQueue..
LNK2038: mismatch detected for ‘_ITERATOR_DEBUG_LEVEL': value ‘0’ doesn’t match value ‘2’ Visual studio를 사용하여 컴파일을 하다 다음과 같은 메세지를 접하게 되었다 찾아보니 참조하는 lib은 릴리즈로 빌드되어 있는데 메인 프로젝트인 exe는 debug로 빌드하려고 하면 발생한다고 한다 외부에서 가져온 lib이라면 디버그 혹은 릴리즈에 맞는 파일을 가져와서 추가하여 빌드해 주면 해결된다 https://learn.microsoft.com/en-us/cpp/standard-library/iterator-debug-level?view=msvc-170&redirectedfrom=MSDN _ITERATOR_DEBUG_LEVEL Learn more about: _ITERATOR_DEBUG_LEVEL learn.microsoft.com 나의 경우엔 한 솔루션 내에 여러 개의 프로젝트가 존재했는데..
CString to char* (UTF8) MFC의 CString을 사용하다가 서드파티 라이브러리라던가 Winapi를 사용하며 char*로 변환해야 하는 일들이 있다 이때 한글이 들어가 있다면 (char*)(LPCTSTR) 이런 강제 형변환으론 정상적으로 한글이 전달되지 않는다 대부분의 WinApi나 서드파티 라이브러리들은 UTF8을 지원하기에 이로 변환해줘야 한다 (물론 visual studio에서 디버깅하면 한글이 보이진 않는다) CString tempPath = L"c:\user\홍길동\temp"; char* transStr = CW2A(tempPath, CP_UTF8);​
boost::log 링크 에러 error LNK2038: mismatch detected for 'boost_log_abi': value 'v2s_mt_nt62' doesn't match value 'v2s_mt_nt6' in checklist.obj boost::log 사용 중 잘 작동하던 코드에서 기능을 추가하다 보니 갑자기 링크에러가 발생했다 1>utils.obj : error LNK2038: mismatch detected for 'boost_log_abi': value 'v2s_mt_nt62' doesn't match value 'v2s_mt_nt6' in checklist.obj 1>utils.obj : error LNK2019: unresolved external symbol "public: __thiscall boost::log::v2s_mt_nt62::attribute_set::attribute_set(void)" (??0attribute_set@v2s_mt_nt62@log@boost@@QAE@XZ) referenced in funct..
visual studio 2022 여러 블럭 주석 풀기 단축키 기본적으로 주석은 라인전체를 블록지정하거나 특정 범위를 지정해서 "Ctrl+Shift+/"를 누르면 주석 설정이 되고 풀린다 그런데 다음과 같이 주석이 공백라인을 포함하여 두 개 떨어져 있을 경우 전체를 블록지정해도 주석 해지가 되지 않는다 그때는 주석 제거 단축키인 "Ctrl+k+u"를 입력해 줘야 한다 쩝 다른 IDE는 그냥 됐었었는데 귀찮게..
ofstream 정의되지 않은 class 'std::basic_ofstream<char,std::char_traits<char>>'을(를) 사용합니다. 파일 쓰기를 위해서 간단하게 함수 호출을 하였다 std::ofstream output_file(filename, std::ios::binary); 컴파일을 돌려보니 'output_file'은(는) 정의되지 않은 class 'std::basic_ofstream'을(를) 사용합니다. 뭔 소리지 왜 정의되지 않았다고..? 생성자가 바뀌었나 찾아보았으나 동일했고 다른 예제들도 동일하게 사용하고 있었다 생성자를 빼고 선언만 해도 동일하게 에러가 발생했다 찾아보니 include가 빠져서 정의되지 않았다고 뜨는것이였다... 😅 #include 을 넣어줬었는데 실제 필요한 건 #include ​ 이것이었단 것... 끝 C++은 컴파일 오류 메시지부터 너무 불친절해...ㅠ