분류 전체보기

Programming/C++ & Unreal

vprintf, vsprintf 등 가변 인자 함수를 활용한 로그 함수 개발 시에 포맷 warning 출력하기

printf C++에서 printf 사용시에 format을 잘못 지정하였다면 이렇게 컴파일러단에서 C4477 C4313 C6067 의 워링 에러가 발생하여 잘못된 포맷으로 인한 오류나 크래시를 방지 할 수 있다. vprintf, vsprintf... 하지만 보통 printf를 저렇게 사용하는 일은 거의 없다. 아래와 같이 보통 로그를 남기는 함수를 va_list를 사용하여 커스터마이징하곤 한다. (UE_LOG도..) 하지만 이렇게 사용하면 포맷 관련 warning이 발생하지 않아서 실수를 저지르기가 너무 쉽다. 해결법 MSVS에서는 저런 사용자 함수에서 포맷 체크를 하는 방법이 없어서 이렇게 편법으로 Debug 빌드 시에만 printf로 체크하는 방식이 가능하다. sizeof() 안에 있는 printf구..

Programming/C++ & Unreal

StackWalk64가 context에 의하여 Access violation를 유발

#include #include #include BOOL InitSymHandler(HANDLE hProcess) { if (SymInitialize(hProcess, NULL, TRUE)) { SymSetOptions(SYMOPT_LOAD_LINES); return TRUE; } return FALSE; } LONG WINAPI UnhandledExceptionHandler(EXCEPTION_POINTERS* exceptionInfo) { CONTEXT* context = exceptionInfo->ContextRecord; STACKFRAME64 stackFrame; memset(&stackFrame, 0, sizeof(STACKFRAME64)); stackFrame.AddrPC.Mode = Addr..

Programming/C++ & Unreal

C++ 가변인자(va_list)를 오버로딩 하지 말자.

#include #include void Print(const char* format, va_list args) { // 2번째 Print 함수에서 호출함 vprintf(format, args); } void Print(const char* format, ...) { // main 에서 호출함 va_list args; va_start(args, format); Print(format, args); va_end(args); } int main() { char a[] = "Hello "; char b[] = "world!"; Print("%s %s", a, b); // "Hello world!" 출력됨. return 0; } 위 코드는 아무 문제가 없다. 가변인자가 잘 들어가서 2번째 Print 함수 -> ..

Programming/C++ & Unreal

C++ parallel for_each (thread) exception

#include #include #include #include #include #include LONG WINAPI UnhandleExceptionHandler(_EXCEPTION_POINTERS* exceptionInfo) { std::cout

Day Life

C# -> C++

C#으로 만 5년을 근무하다가 드디어 C++을 할 기회가 생겨서 이직하게 되었다. 이제 다시 쌩초보자가 되어 열심히 C++을 공부해야겠다. 두렵고 설렌다.

Programming/C# & Unity

C# perfmon 샘플 코드

internal class Program { const string CategoryName = "JangHyeong"; const string CounterName = "Test"; static private bool looping = true; // 1초마다 0~99 사이의 값으로 카운터를 남긴다. static void Loop() { var random = new Random(); var counter = new PerformanceCounter(CategoryName, CounterName, false); while (looping) { counter.RawValue = random.Next(100); Thread.Sleep(1000); } } static void Main(string[] args..

Programming/C# & Unity

C# 람다 클로저 원리

개요 C#의 람다식의 사용법과 어떻게 작동하는지 간략하게 정리한다. 람다 int number = 5; // input에 5를 더하여 리턴하는 익명 함수를 담은 변수 action. var action = (int input) => { return number + input; }; // 5 + 10이 리턴되어 15가 출력된다. Console.WriteLine(action(10)); // 출력: 15 위 코드에서 "(int input) => { return number + input; };" 구문을 람다 식이라고 부르며, 함수지만 이름이 없어서 무명 함수(메서드)라고도 부른다. 이때, 익명 함수 외부에서 가져온 변수 number를 캡처된 변수라고 부른다. 그리고 캡처가 완료되어 사용가능한 상태가 된 익명 함수..

Programming/C# & Unity

C# Foreach Closure

C#에서 람다를 사용하여 람다 밖에서 사용 중인 변수를 가져오면(캡처하면) 항상 레퍼런스로 전달되는 것 처럼 처리가 된다. (람다-클로저 관련 원리에 대한 간략한 포스팅) for (int i = 0; i { Thread.Sleep(1000); Console.WriteLine(i); }).Start(); } // 10이 10번 출력됨. 위의 경우에는 하나의 i가 10번 레퍼런스 전달되었고, 1초뒤에 forloop가 전부 끝나서 10이 된 i가 10번 출력되게 된다. 그렇다면 foreach를 사용하면 어떨까? foreach (int i in Enumerable.Range(1, 10)) { new Thread(() => { Thread.Sleep(1000)..

Programming/C# & Unity

C# 박싱

개요 흔히 면접 준비 때 박싱에 대해서 공부하게 된다. 하지만 실무에서는 거의 대부분 고려할 일이 없어서 시간이 지날수록 왜곡된 기억과 함께 여러 오해가 생기게 되었는데 관련해서 정리하려 한다. 박싱에 대하여 Stack에 있던 값을 Heap으로 옮기는 작업. 스택에 있는 값을 Heap으로 옮기면서, Heap에 메모리 할당, 값 복사가 일어나서 느리다. 더 자세한 내용은 구글에 C# 박싱을 검색.... int a = 5; object boxedA = a; Dictinary의 Key로 enum을 사용하면 안 되는가? .Net 4.0부터 Dictinary가 개선되어서 문제가 없어졌다. 이전에는 Dictinary 내부에서 Equal 함수를 사용하는데 이때, Enum 간 Equal 체크 시에 박싱이 일어나는 문제..

Programming/MSSQL

MSSQL GO문 트랜잭션

개요 MSSQL에서 스키마를 다량으로 추가/수정하는 쿼리를 테스트하려고 [BEGIN TRAN]-[ROLLBACK TRAN]을 걸고 테스트하는 도중, [ROLLBACK TRAN]이 씹히고 스키마가 모조리 변경되는 대참사가 발생한 이슈가 있어서 기록 및 제대로 이해하려는 목적으로 포스팅을 한다. GO를 사용하지 않는 트랜잭션 BEGIN TRAN SELECT @@TRANCOUNT -- : 1 CREATE TABLE [dbo].[TEST1] -- 추후에 롤백됨. ( [id] INT ); CREATE TABLE [dbo].[TEST1] -- 중복 생성으로 인한 에러가 발생하고, 트랜잭션이 롤백된 채로 이후 모든 명령어가 무시된다. ( [id] INT ); SELECT @@TRANCOUNT -- : 출력되지 않는다..

장형이
'분류 전체보기' 카테고리의 글 목록