2013-05-19 4 views
0

Je suis novice en matière de pointeurs c + + et j'ai un problème avec l'obtention d'une valeur à partir d'un pointeur.Get Pointer Value

J'ai un pointeur, verticesPosBegin, qui pointe vers le début d'un tableau utilisé pour contenir des positions de sommet. Chaque sommet est stocké sous la forme d'un vecteur flottant à trois composantes (xyz).

J'ai besoin d'en obtenir chaque sommet et d'accéder à ses valeurs x, y, z.

je l'ai fait de la façon suivante:

NxVec3* positions = (NxVec3*)data.verticesPosBegin; 

for(int i=0;i<nrVertices;i++) 
{ 

    NxVec3* p1 = (NxVec3*)positions; 
    printf("Vertex coordinates x: %d, y: %d, z: %d\n", p1->x, p1->y, p1->z); 
    positions++; 
} 

(NxVec3 est juat un type défini par un moteur physique que je l'utilise, il est fondamentalement une structure de la forme (x flotteur, le flotteur y, flotteur z))

Mais cela ne me donne pas les valeurs des coordonnées, mais les adresses, je suppose, puisqu'elles représentent de très grands nombres. Toute aide serait grandement appréciée.

+3

Êtes-vous su les moulages sont-ils nécessaires? Et quels sont les types de 'p1 -> [x, y, z]'? – 0x499602D2

+0

Aussi, ce sont des gens C++, apprendre à utiliser 'std :: cout'. Doit être dit;) – mwerschy

+0

@ 0x499602D2: Selon la phrase après le code, ils sont flottants. –

Répondre

6

Selon votre déclaration, p1->x, p1->y et p1->z sont des tapez float, correct? Si c'est le cas, vous passez une chaîne de format incorrecte à printf. Le drapeau %d est pour les entiers. Vous voulez probablement que le drapeau %f à la place. Les nombres énormes que vous obtenez ne sont pas des adresses, mais plutôt des valeurs flottantes, converties en doubles, puis leurs motifs binaires interprétés comme des entiers, bien que ce soit un comportement techniquement indéfini.

http://en.cppreference.com/w/cpp/io/c/fprintf

Si vous utilisez à la place Cout, vous n'avez pas à vous soucier des choses comme ça, car il est de type sûr.

P.S.

Stop à la coulée. Cela ne fera que masquer la compilation et les déplacer vers des erreurs d'exécution, ce qui est nettement pire.

0

Si je reçois le droit NxVec3, voici la définition, NxVec3, donc, selon le fichier d'en-tête, ce qui suit devrait fonctionner:

NxVec3* positions = (NxVec3*)data.verticesPosBegin; 

for(int i = 0;i < nrVertices; ++i) 
{ 
    float *p = positions[i].get(); 
    cout << p[0] << ' ' << p[1] << ' ' << p[2] << endl; 
} 
+0

Merci, cela a fonctionné. Le problème était en effet le type dans la fonction printf. – user2399378

1
  • Si vous voulez vraiment utiliser un pointeur (je vous recommande que seulement à des fins de pratique) et
  • si data.verticesPosBegin pointe vers un bloc contigu de NX3 flotteurs
  • et si NxVec3 est classe/struct avec seulement trois membres de données float x, y, z;

les éléments suivants devraient fonctionner:

NxVec3 *positions = (NxVec3*)data.verticesPosBegin, *p(positions); 

for(unsigned int i=0;i<nrVertices;i++) 
{ 
    cout << "Vertex coordinates "; 
    cout << "x: " << p->x << ", "; 
    cout << "y: " << p->y << ", "; 
    cout << "z: " << p->z << endl; 
    ++p; 
} 
+1

L'évaluation si les trois premiers flotteurs étant tout ce qui est imprimé est faux. 'p1' est mis à la valeur du pointeur' positions' juste incrémenté, qui ne se réinitialise jamais dans la boucle, et ne s'incrémente que pour chaque itération. La déclaration d'ouverture, par conséquent, dans cette réponse, est * erronée * (bien que le code fonctionnera, mais seulement parce qu'il contourne implicitement le vrai problème: en utilisant '% d' pour imprimer un' float' non diffusé). – WhozCraig

+0

Lecture bâclée par moi - Upvote pour vous. Je vais éditer ça. (Bien que je n'appellerais pas cela détourner le jeu. Remplacer la mauvaise sortie par une version correcte est une bonne solution, sans tenir compte de l'utilisation de printf() ou de cout.) – Pixelchemist