2016-09-13 1 views
1

J'ai utilisé memcpy pour copier une structure Vertex composée d'objets glm :: vec3. Il a travaillé pour copier la structure dans une fonction de classe. Il ne fonctionnait pas dans le constructeur de copie qui était appelé lorsque cette fonction renvoyait l'objet de classe.Memcpy équivalent résultats différents?

Pourquoi?

fonction de classe d'objets retour

ShapeData ShapeGenerator::drawTriangle() { 
    ShapeData ret; 

    Vertex verts[] = { 
     glm::vec3(0.0f, 1.0f, 0.0f), 
     glm::vec3(1.0f, 0.0f, 0.0f), 

     glm::vec3(-1.0f, -1.0f, 0.0f), 
     glm::vec3(0.0f, 1.0f, 0.0f), 

     glm::vec3(1.0f, -1.0f, 0.0f), 
     glm::vec3(0.0f, 0.0f, 1.0f), 
    }; 

    ret.numVerts = NUM_ARRAY_ELEMENTS(verts); 
    ret.verts = new Vertex[ret.numVerts]; 
    memcpy(ret.verts, verts, sizeof(verts)); //WORKS 

    GLushort indicies[] = {0,1,2}; 
    ret.numIndicies = NUM_ARRAY_ELEMENTS(indicies); 

    ret.indicies = new GLushort[ret.numIndicies]; 
    memcpy(ret.indicies, indicies, sizeof(indicies)); 

    return ret; 
} 

Copy Constructor

ShapeData(const ShapeData& data) { 

    verts = new Vertex[data.numVerts]; 
    //memcpy(verts, data.verts, sizeof(data.verts)); //DOES NOT WORK 
    std::copy(data.verts, data.verts + data.numVerts, verts); 


    indicies = new GLushort[data.numIndicies]; 
    memcpy(indicies, data.indicies, sizeof(data.indicies)); 

    numVerts = data.numVerts; 
    numIndicies = data.numIndicies; 

    std::cout << numVerts << std::endl; 

} 

Vertex:

#ifndef VERTEX_H 
#define VERTEX_H 

#include <glm/glm.hpp> 

struct Vertex { 
    glm::vec3 position; 
    glm::vec3 color; 
}; 

#endif 
+1

Je vois que 'verts []' est un tableau d'objets Vertex, mais quelle est la déclaration de 'indices'? Si, par exemple, il s'agit d'un pointeur vers la mémoire dynamique, 'sizeof (indices)' sera la taille d'un pointeur, pas du tableau pointé vers. Vous pouvez essayer 'sizeof (indices [0]) * data.numIndices'. – Davislor

Répondre

8
memcpy(verts, data.verts, sizeof(data.verts)); //DOES NOT WORK 

ne fonctionne pas depuis verts est un pointeur, pas un tableau. sizeof(data.verts) n'évalue pas à la taille du tableau vers lequel le pointeur pointe. Il évalue simplement à la taille d'un pointeur sur votre plate-forme.

Vous devriez pouvoir utiliser:

size_t n = sizeof(*data.verts)*data.numVerts; 
memcpy(verts, data.verts, n); 
+0

Merci! Et l'autre fonctionne puisqu'il est 'Vertex []' pas un 'Vertex *'. Merci beaucoup! – Chemistpp

+0

@Chemistpp, c'est correct. –

+1

Que cela fonctionne ou non - vous devriez toujours utiliser 'std :: copy' et non' memcpy', car il fonctionne toujours même si le type n'est pas correctement mémcpyable –