2011-08-24 6 views
3

permet de dire que je donne les résultats suivants:pointeur à un problème de syntaxe pointeur

void init_gpu(cuComplex* d_hhBuff) 
{ 
    cutilSafeCall(cudaMalloc((void **)&d_hhBuff, memsize)); 
} 

et je l'appelle avec quelque chose comme

cuComplex *my_buff; 
init_gpu(my_buff); 

Eh bien, quand init_gpu retours, il ne pointe pas vers la mémoire de l'appareil que cudaMalloc est alloué.

Comment puis-je modifier cela afin que my_buff pointe vers le d_hhBuff modifié que cudaMalloc crée pour l'appelant de init_gpu?

Répondre

6

Le problème est que vous passez le pointeur par valeur. Changer l'en-tête de fonction

void init_gpu(cuComplex *& d_hhBuff) 
2

Votre d_hhBuf est une copie locale. Ce que vous devez faire est de passer le pointeur par référence:

void init_gpu(cuComplex * & d_hhBuff) 
0

Supposons que vous typedef:

typedef cuComplex* ComplexPointer; 

Et écrire une fonction:

void ChangeComplex(ComplexPointer ptr) 
{ 
    ptr = new cuComplex; 
} 

et l'appeler:

ComplexPointer cptr; 
ChangeComplex(cptr); 

Que voulez-vous déduire en regardant c tout et la fonction (et pas sachant le typedef)? Vous diriez, le ptr (cptr) est passé par valeur, et non par référence/pointeur et ne changera pas.

Ne manquez cet appel:

cuComplex* ptr; 
ChangeComplex(cptr); 

C'est exactement comme ci-dessus, vous êtes en fait le type passait ComplexPointer - qui vient d'être passé par valeur.

Enfin comprendre la signature changé:

void ChangeComplex(cuComplex*ptr); 

Et il est toujours le même - vous passer le type cuComplex* par valeur et non par référence!

Questions connexes