我需要你的帮助!
我喜欢复制这样的结构:
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));
我这样试试:
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;
}
我该如何解决这个问题?
提前感谢您的帮助!!
更新 - 我的vertex
深度复制解决方案 - thx获取所有帮助:
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 :(得分:2)
原始答案:
假设顶点指向顶点数组,并且每个顶点包含3个long(x,y,z):
dst->vertex = (long **)malloc(dst->num_vertex * 3 * sizeof(long);
memcpy(dst,src,dst->num_vertex * 3 * sizeof(long));
更新,因为我意识到这可能有效,但不干净或特别安全 正如我在评论中提到的,如果你有
,代码会更清晰typedef struct vertextag {
long x;
long y;
long z;
} vertex_type;
然后做了: dst-&gt; vertex =(vertex_type *)malloc(dst-&gt; num_vertex * sizeof(vertex_type); memcpy(dst,src,dst-&gt; num_vertex * sizeof(vertex_type));
答案 1 :(得分:2)
我将假设顶点不在对象之间共享。也就是说,它们属于有问题的结构。
有两个主要案例需要考虑:
1. Copying into a new object
2. Copying into an existing object
复制到新对象很简单。
1a. Allocate space for <num_vertex> pointers.
1b. Allocate space for each vertex.
2a. Copy <num_vertex> pointers from source to destination.
2b. Copy <num_vertex> vertices from source to destination.
复制到现有对象与复制到新对象非常相似,只是必须先执行以下操作。
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.
希望这有帮助。
答案 2 :(得分:1)
这取决于顶点数组是否属于您要复制的对象,或者它是否在多个对象之间共享。两种方法都在实践中使用,具体取决于具体情况(如果可以分别为复制对象更改顶点,则必须复制数组 )。您必须选择哪些对您正在开发的应用程序有意义。
如果数组可以由指向它们的对象共享,只需复制指针即可。
dst->vertex = src->vertex;
如果每个对象都有自己的顶点(因此可以为复制的对象单独更改它们),则必须分配和复制数组以及存储指针的位置,并将指向该位置的指针设置为副本 - 对象
long* vertexCopy = malloc(howmanybytes);
memcpy(vertexCopy, *src->vertex, howmanybytes);
long** holder = malloc(sizeof(void*));
holder[0] = vertexCopy;
dst->vertex = holder;