2016-05-10 1 views
1

Donc, je suis en train d'ajouter deux vecteurs en utilisant un code d'assemblage, mais je problème avec:Passant struct à fonctionner dans c

sse_vector4_add(set_vector(2,2,2,2),set_vector(4,2,4,2)); 

Je ne sais pas comment passer ces vecteurs à cette fonction.

typedef struct vector4 { 
    float x, y, z, w;  
} vector4; 

// Set values to a vector4 
vector4 set_vector(float x, float y, float z, float w) { 
    vector4 ret_vector = { x, y, z, w }; 
    return ret_vector; 
} 

// Use sse to add the elements of two vectors a + b 
vector4 sse_vector4_add(vector4 *op_a,vector4 *op_b) { 
    vector4 ret_vector; 
    asm( 
     "mov %%eax,op_a \n"    // Load pointers into CPU regs 
     "mov %%ebx,op_b \n" 
     "movups %%XMM0,(%%EAX) \n"  // Move the vectors to SSE regs 
     "movups %%XMM1,(%%EBX) \n" 
     "addps %%XMM0,%%XMM1 \n"  // Add elements 
     "movups (ret_vector),%%XMM0 \n" // Save the return vector 
     : 
    ); 
    return ret_vector; 
} 

void main() { 
    // Add two vectors 
    sse_vector4_add(set_vector (2,2,2,2),set_vector(4,2,4,2)); 
    getchar(); 
} 

Fonction sse_vector4_add a été faite à partir d'une fonction similaire, mais en C++.

+2

Sauf si vous êtes dans un environnement autonome, 'main' renvoie' int'. – jxh

+0

peut-être une option est de modifier la fonction d'ajout de vecteur pour prendre des arguments par valeur –

Répondre

2

Créez des variables en utilisant set_vector pour les initialiser. Ensuite, passez leurs adresses à la fonction.

vector4 a = set_vector(2,2,2,2); 
vector4 b = set_vector(4,2,4,2); 
vector4 c = sse_vector4_add(&a, &b); 
+0

Ne serait-il pas également possible de renvoyer des pointeurs sur les structures de 'set_vector()' et d'envoyer le ou les pointeurs 'sse_vector4_add()'? Donc 'vector4 * set_vector()' et ensuite 'sse_vector4_add (set_vector (...), set_vectcor (...));' – KevinDTimm

+0

@KevinDTimm: Je ne voulais pas modifier les interfaces existantes. De même, vous ne pouvez pas renvoyer de pointeurs sur les variables locales de fonction. Si vous allouez dynamiquement, alors le récepteur doit libérer. L'interface existante est déjà assez propre. – jxh

+0

Compris - et oui vous auriez à modifier grandement les internes de 'set_vector()' pour que ma suggestion fonctionne. Je voulais juste me calmer que j'ai toujours des pointeurs. – KevinDTimm