2013-08-31 3 views
2

경고 : '(stride * 4u)'의 'unsigned int'에서 '{short short unsigned int}'로의 변환이 C에서 잘못 형성되었습니다. ++ 11 -Wnarrowing]부호없는 int에서 short unsigned int 로의 변환

내가는 MinGW에서 다음 코드 컴파일이 경고를 얻고 왜 알아낼 수 없습니다 : 그 안에 그것은 stride * sizeof(gs_scalar)에 대해 불평

unsigned stride = 3; 

D3DVERTEXELEMENT9 NORMALELEMENT = 
{ 0, stride * sizeof(gs_scalar), D3DDECLTYPE_FLOAT3, D3DDECLMETHOD_DEFAULT, D3DDECLUSAGE_NORMAL, 0 }; 
if (useNormals) stride += 3; 

(gs_scalar입니다 float를) 중괄호,하지만 나는 어떻게 보이지 않는다. 그의 좁은 변환은 sizeof 바이트 수를 반환하기 때문입니다. stride의 데이터 형식을 WORD, DWORD, CHAR, everything으로 변경하려고 시도했지만 동일하거나 유사한 경고가 계속 나타납니다.

+2

중괄호 초기화를 사용하면 C++ 11에서 변환을 축소 할 수 없습니다.그 의도가 명백한 캐스트에서'stride * sizeof (gs_scalar)'를 래핑하려고 시도 했습니까? – goji

+0

C++ 11에서는 * 오류 * 경고가 아닙니다 ... –

답변

3

봐 :

struct D3DVERTEXELEMENT9 { 
    WORD Stream; 
    WORD Offset; 
    BYTE Type; 
    BYTE Method; 
    BYTE Usage; 
    BYTE UsageIndex; 
}; 

합니다 (형식 정의의 물건을 제거하지만 http://msdn.microsoft.com/en-us/library/windows/desktop/bb172630%28v=vs.85%29.aspx에서).

따라서 NORMALELEMENT.Offsetstride * sizeof(gs_scalar)으로 초기화됩니다.

sizeof(gs_scalar)의 유형은 플랫폼에 분명히 unsigned int입니다 std::size_t이며, stride의 유형은 unsigned가 (즉 unsigned int), 그래서 stride * sizeof(gs_scalar)의 유형 unsigned int입니다. 그러나 NORMALELEMENT.Offset의 유형은 WORD이고 unsigned short입니다.

나는 플랫폼에 unsigned int 폭 32 비트하지만 넓은 unsigned short 16 비트이라고 생각 때문에 (stride * sizeof(gs_scalar)의 값이 16 비트에 맞지 않는 데이터를 잃게 될 경우)이 참으로 축소 변환입니다 . 당신이 WORDstride을 정의하더라도

, 그것은 sizeof(gs_scalar)과 곱셈에 unsigned int로 승진, 그래서 상황은 동일하게 유지된다. 당신이 stride * sizeof(gs_scalar) 이상 USHRT_MAX (즉 65535 즉, 당신이 16 -1에 대한) 가능성이 보인다 (예에서 그것의 3 * 4, 즉 12), 당신은 사용할 수 없을 것 있는지 경우

던지기 (코멘트에있는 Troy에 의해), 예를 들면 static_cast<WORD>(stride * sizeof(gs_scalar)).

+0

대단히 고맙습니다! – Goombert

2

strideunsigned이므로이 값이 너무 커서 unsigned short에 맞지 않을 수 있습니다. 또한 sizeofWORD보다 큰 유형 std::size_t입니다.

strideconst unsigned으로 설정하면 컴파일러에서 12의 실제 값이 unsigned short에 맞고 오류가 사라지는 것을 볼 수 있습니다. 그러나 상수가 아닌 경우 중괄호 안의 이니셜 라이저가 자르거나 넘칠 수 없기 때문에 계산이 적합하다는 것을 명시 적으로 보장해야합니다. ("좁히기"란 데이터를 잃는 것을 말하며 숫자의 한쪽 끝에있는 자릿수를 자르는 것을 의미합니다.)

그냥 static_cast<WORD>(…)을 사용하십시오. D3DVERTEXELEMENT9의 정의에서

+0

경고를 해결해 주셔서 감사합니다! 둘 다 훌륭합니다. – Goombert

+0

'const'에 관한 것은 흥미 롭습니다. –

+1

@ user2734025 도움이된다면 upvote하고 문제가 해결되면 체크 표시를 클릭하십시오. 잘 설명 된 질문에 감사드립니다. – Potatoswatter

관련 문제