2016-11-17 9 views
0

SSE 명령을 배우려고하고 있는데 두 개의 matice를 곱하려고합니다.내부 포인터로 유니온 포인터 선언

typedef union{ 
    __m128 vec; 
    float* afloat; 
}u_float; 

int main(){ 

__declspec(align(16)) u_float *mat1; 

mat1 = (u_float*)malloc(sizeof(u_float)*4); 
for(int i = 0; i < 4; i++) 
    mat1[i].afloat = (float*)malloc(sizeof(float)*4); 

for(int i = 0; i < 4; i++) 
    for(int j = 0; i < 4; j++) 
      mat1[i].afloat[j] = 1; // Error. 

return 0;} 
  1. 이 왜 그 오류를 던지고있다 : 나는 그들 중 하나를 초기화 할 때 그러나,이 프로그램은 여기에 오류가 발생합니다 코드의

    Access violation when typing in location

    와 충돌?

  2. 그리고이 문제를 해결하는 가장 좋은 방법은 무엇입니까?
+0

이 질문은 SSE 지침과 어떤 관련이 있습니까? – zx485

+0

@ zx485 나중에 _mm_mul_ps'와'_mm_hadd_ps' 함수를 사용하여 matice를 곱합니다. 그러나 여기서 주요한 문제는 SSE와는 아무런 관련이 없습니다. – blackout

+0

그 노조의 요점은 무엇입니까? 나중에 코드가'__m128' 값이나 포인터를 가지고 있는지 어떻게 결정합니까? '__m128 * vec'라고 쓰고 싶습니까? –

답변

5

이것은 union과 아무런 관련이 없습니다. 당신은 당신의 루프에 오타가 있습니다

for(int i = 0; i < 4; i++) 
    for(int j = 0; i < 4; j++) // <-- Here 
      mat1[i].afloat[j] = 1; 

공지 사항 J 4보다 작은, 그래서 이것은 무한 루프 때가 미만 4하지 동안 루프 루프의 내부가.

+0

걱정할 필요가 없습니다! 몇 가지 밀교적인 언어를 사용하는 것보다 훨씬 낫습니다. :-) – templatetypedef