2016-11-17 2 views
0

Я пытаюсь изучить инструкции SSE, и я стремлюсь умножить два мата. Однако, когда я пытаюсь инициализировать один из них, программа вылетает сОбъявление указателя объединения с указателем внутри

Access violation when typing in location

Вот код, который бросает ошибку:

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. Почему метание эту ошибку?
  2. И что является лучшим способом решения проблемы?
+0

Каким образом этот вопрос связан с инструкциями SSE? – zx485

+0

@ zx485 Позже я буду использовать функции '_mm_mul_ps' и' _mm_hadd_ps' для умножения матов. Однако главная проблема здесь не имеет ничего общего с 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; 

Обратите внимание, что внутренняя для петель петель в то время как я меньше 4, а не когда J меньше, чем 4, так что петли бесконечно.

+0

Не беспокойтесь! Это чертовски много лучше, чем ударить по какому-то эзотерическому языку. :-) – templatetypedef

Смежные вопросы