2013-02-17 5 views
5

Ich brauche deine Hilfe!tiefe Kopie der Struktur mit Pointer Point in C

Ich mag eine Struktur wie diese kopieren:

typedef struct PackageObject_s { 
    long **vertex;   // vertices 
    long num_vertex;  // count of vertices 
    long objectType;  // 
    REAL r;    // 
    long bottom[3];  // bounding box bottom vector 
    long top[3];   // bounding box top vector 
    long *start;   // 
    REAL coverage;  // 
} PackageObject __attribute__ ((aligned)); 

ich es so versuchen:

static inline void PackageObject_copy(PackageObject *dst, const PackageObject *src) { 

    dst->num_vertex = src->num_vertex; 
    dst->objectType = src->objectType; 
    dst->r   = src->r; 
    vec_assign3l(dst->bottom, src->bottom); 
    vec_assign3l(dst->top, src->top); 

    // TODO copy **vertex ??? 

    dst->coverage = src->coverage; 
    dst->coverage = src->coverage; 
} 

Wie kann ich dieses Problem lösen?

Vielen Dank im Voraus für Ihre Hilfe !!

UPDATE - meine Lösung für deep von vertex - thx für alle Hilfe:

dst->vertex = (long *)malloc(dst->num_vertex * 3 * sizeof(long)); 
for (long i=0; i < src->num_vertex; i++) { 
    dst->vertex[i] = (long)malloc(3*sizeof(long)); 
    memcpy(dst->vertex[i],src->vertex[i],3 * sizeof(long)); 
} 
+0

Sie müssen ** Vertex? Kopieren! – amrfaissal

+0

Danke für alle Antworten (@Sparky, @Foon, @eznme). Ich habe es :-)
'dst-> Vertex = (lang *) malloc (dst-> num_vertex * 3 * sizeof (lang)); für (lang i = 0; i < src-> num_vertex; i ++) {dst-> Scheitel [i] = (lang) malloc (3 * sizeof (lang)); memcpy (dst-> Eckpunkt [i], src> Eckpunkt [i], 3 * sizeof (long)); } ' – romi1013

Antwort

2

Ich gehe davon aus, dass die Vertices nicht zwischen Objekten geteilt werden. Das heißt, sie gehören zu der fraglichen Struktur.

Es gibt grundsätzlich zwei Fälle zu betrachten:

1. Copying into a new object 
2. Copying into an existing object 

Kopieren in das neue Objekt ist unkompliziert.

Das Kopieren in ein vorhandenes Objekt entspricht weitgehend dem Kopieren in ein neues Objekt, mit der Ausnahme, dass Sie zuerst Folgendes ausführen müssen.

0a. Loop through each element of <vertex> and free the vertex. 
0b. Free the array of vertex pointers. 
1. Follow the steps for copying into a new object. 

Hoffe das hilft.

2

Ursprüngliche Antwort:

Unter der Annahme, Scheitelpunkte auf einer Reihe von Eckpunkten, und dass jeder vertice enthält 3 longs (x z, y):

dst->vertex = (long **)malloc(dst->num_vertex * 3 * sizeof(long); 
memcpy(dst,src,dst->num_vertex * 3 * sizeof(long)); 

aktualisieren, weil ich erkennen dies funktionieren könnte, aber nicht sauber ist oder besonders sicher Wie ich bereits erwähnt in Kommentare, würde Code sauberer sein, wenn Sie

typedef struct vertextag { 
    long x; 
    long y; 
    long z; 
} vertex_type; 

hatte Und dann tat: DST-> Vertex = (vertex_type *) malloc (DST-> num_vertex * sizeof (vertex_type); memcpy (dst, src, dst-> nummer_vertex * sizeof (vertex_type));

+0

Bei einigen der anderen Antworten hatte ich nicht über zwei Fälle nachgedacht. In dieser Antwort wird davon ausgegangen, dass das Vertex-Array für jedes Objekt eindeutig ist (oder Sie es nicht wirklich in die Tiefe kopieren müssen). Es nimmt auch an, dass dst ein brandneuer Zeiger ist (aber dass er auf einen gültigen Satz von Speicher zeigt, den Sie entweder malloc oder auf dem Stapel erstellt haben); Wenn es kein brandneues Objekt ist, sollten Sie mit Sparkys Ansatz gehen. Beachten Sie, dass Sie entweder prüfen sollten, ob dst == src ist, wenn dst nicht garantiert ein brandneues Objekt ist oder dokumentieren Sie es zumindest in der Funktion, dies nicht zu tun, da sonst Speicher verloren geht. – Foon

+0

Ihr Code wäre wahrscheinlich sauberer, wenn Sie einen struct vertex_type {lang x, lang y, lang z)} hätten, den Sie anstelle von long [3] für die Bounding Boxes verwenden würden und als * vertex_type statt lang **; In diesem Fall würden Sie tun (vertex_type *) malloc (dst-> num_vertex * sizeof (vertex_type); – Foon

+0

Das stimmt. Das Vertex-Array ist für jedes Objekt einzigartig. Jedes Objekt hat num_vertex-Vertices. Jeder Vertex ist eine 3D-Koordinate (long) Also deine erste Lösung funktioniert nicht Wenn ich einen Knoten ändere, ändere ich ihn mit dieser Lösung in beiden Objekten. – romi1013

1

Es hängt davon ab, ob das Vertex-Array zu dem Objekt gehören soll, das Sie kopieren möchten, oder ob es unter mehreren Objekten geteilt wird. Beide Ansätze werden in der Praxis je nach Situation verwendet (das Array muss kopiert werden, wenn die Scheitelpunkte für das Kopierobjekt separat geändert werden können). Sie müssen wählen, welche von ihnen für die Anwendung, die Sie entwickeln, sinnvoll ist.

Wenn das Array von Objekten geteilt werden kann, die auf sie verweisen, kopieren Sie einfach den Zeiger.

dst->vertex = src->vertex; 

Wenn jedes Objekt seine eigenen Ecken hat (so können sie separat für das kopierte Objekt geändert werden), dann müssen Sie den Array zuweisen und kopieren und den Ort, an dem der Zeiger gespeichert ist und einen Zeiger auf diese Stelle gesetzt in das Kopierobjekt.

long* vertexCopy = malloc(howmanybytes); 
memcpy(vertexCopy, *src->vertex, howmanybytes); 
long** holder = malloc(sizeof(void*)); 
holder[0] = vertexCopy; 
dst->vertex = holder;