Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.
위 에러 메시지로 인터넷을 검색하면 dll과 dll을 사용하는 프로젝트간의 함수 호출 규칙(cdecl, stdcall)이 달라서 발생하고 동일하게 맞춰주면 해결된다고만 나오지만 근본적으로는 함수 호출할때와 호출 끝났을때의 콜 스택이 달라졌을때 발생한다.
호출 규칙이 같아도 해당 에러메시지가 발생하는 경우는 아래와 같이 라이브러리와 라이브러리를 사용하는 프로젝트의 헤더가 달라서 가상함수 테이블이 다르고 전달인자가 다른 함수를 호출하게 되는 경우가 있다.
1> C:\Program Files (x86)\Windows Kits\8.1\Include\shared\winerror.h(50497) : 'D3D11_ERROR_DEFERRED_CONTEXT_MAP_WITHOUT_INITIAL_DISCARD'의 이전 정의를 참조하십시오.
UI의 프레임에서 화면크기만한 텍스쳐에 모든 오브젝트를 미리 그려놓고 UI랜더는 그 텍스쳐 한장만 화면에 그리는 비교적 단순한 로직이고 UI랜더를 포함함 모든 오브젝트는 최상위 부모 클래스의 같은 함수로 랜더되기 때문에 UI랜더에서 문제가 생긴다면 UI프레임에서도 문제가 생겨야 하지만 UI프레임에서는 문제가 생기지 않아서 이 문제의 원인이 상상조차 안됐었는데 의외로 간단한 부분이 문제였다.
다른 오브젝트와 UI랜더의 유일한 차이점은 UI랜더에서만 노말맵을 사용하지 않는 다는 것인데 기본 노말맵은 셋팅되어있고 노말맵을 NULL로 셋팅하려고 하면 예외처리로 원래 텍스쳐를 그대로 들고 있기 때문에 의도치 않게 노말맵을 셰이더에 보내주면서 셰이더에는 노말맵 텍스쳐를 선언하지 않은게 원인이었다.
/***********************************************************
4로 나누어서 떨어지는 해는 윤년입니다.예를 들면 2004년 2008년.
100으로 나누어서 떨어지는 해는 윤년이 아닙니다. 2100년 2200년.
400으로 나누어서 떨어지는 해는 윤년입니다.2000년 2400년.
***********************************************************/
// 윤년이 아니면 0을 리턴, 윤년일 경우 1을 리턴...
============================ 2번째 ========================
/***********************************************************
4로 나누어서 떨어지는 해는 윤년입니다.예를 들면 2004년 2008년.
100으로 나누어서 떨어지는 해는 윤년이 아닙니다. 2100년 2200년.
400으로 나누어서 떨어지는 해는 윤년입니다.2000년 2400년.
***********************************************************/
// 윤년이 아니면 0을 리턴, 윤년일 경우 1을 리턴...
if( ( gumy % 4 ) == 0 ) //gumy 는 연도...함수에서 넘겨 받을 값...
{ //4로 나누어 떨어지면 윤년...
if( ( (gumy % 100) == 0 ) != ( ( gumy % 400) == 0 ) )
{ // 100으로 나누어 떨어지면서
// 400으로 나누어 떨어지지 않으면 윤년 아님...
return 0;
}
else //100으로 나누어 떨어지지 않거나
{ //4로 나누어지고, 400으로 나누어지면 윤년
return 1;
}
}
else // 4로 나누어 떨어지지 않으면 윤년아님
{
return 0;
}
============================ 3번째 ========================
/***********************************************************
4로 나누어서 떨어지는 해는 윤년입니다.예를 들면 2004년 2008년.
100으로 나누어서 떨어지는 해는 윤년이 아닙니다. 2100년 2200년.
400으로 나누어서 떨어지는 해는 윤년입니다.2000년 2400년.
***********************************************************/
// 윤년이 아니면 0을 리턴, 윤년일 경우 1을 리턴...
if( ( gumy % 100 ) == 0 ) //gumy 는 연도...함수에서 넘겨 받을 값
{ //100으로 나누어 떨어지면 윤년아님
if( ( gumy % 400 ) == 0) //400으로도 나누어 떨어지면 윤년
{
return 1;
}
else // 100으로만 나누어 떨어지면 윤년아님
{
return 0;
}
}
else // 100으로 나누어 떨어지지 않은 경우
{
if( ( gumy % 4 ) == 0 ) // 4로 나누어 떨어지면 윤년
{
return 1;
}
else //4로 나누어 떨어지지 않으면 윤년아님
{
return 0;
}
}