5

あなたの助けが必要です!

次のような構造体をコピーするのが好きです。

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)); 
}
4

3 に答える 3

2

頂点はオブジェクト間で共有されていないと仮定します。つまり、それらは問題の構造に属しています。

考慮すべき主なケースが 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.

お役に立てれば。

于 2013-02-17T18:18:21.423 に答える
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->vertex = (vertex_type *)malloc(dst->num_vertex * sizeof(vertex_type); memcpy(dst,src,dst->num_vertex * sizeof(vertex_type));

于 2013-02-17T17:40:03.907 に答える
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;
于 2013-02-17T17:46:36.697 に答える