2

重複の可能性:
ある構造を別の構造にコピーする

私は次のように定義された構造体を持っています

struct CKTcircuit 
{ 
    more than a 100 pointers and objects of different types  of structure.
    this structure has around 500 lines just declaring variables & pointers.
}

これで、このタイプのオブジェクトがインスタンス化されました。

そして、私はこれと同じタイプのコピーを作成する必要があります。

どうすればこれを行うことができますか?

PS:計算を実行し、CKTcircuitオブジェクトを変更する別のスレッドを起動する必要があるため、これを行う必要があります。

4

2 に答える 2

1

計算にはどのようなデータが必要ですか?次に、必要なデータを保持するための新しい構造体を作成できますか?

struct WorkingData
{ 
    //data needed for calculations
}

struct CKTcircuit source = //whatever;
struct WorkingData work;
CKTcircuit_populateWorkingData(source, &work);
calculate(&work);

または、作業データにaCKTcircuitを使用しますが、ポインターを含む構造のクローンを作成するように注意してください。

struct CKTcircuit source = //whatever;
struct CKTcircuit work;
CKTcircuit_populateWorkingData(source, &work);
calculate(&work);

しかし、100人のメンバーは世界の終わりではありません。

弾丸をバイト化し、ルールを理解し、次のようなアプローチでディープクローンを作成する必要があるかもしれません。

メンバーに注釈を付けて、各構造体が浅いクローンであるか、深いクローンが必要かを判断します。

struct CKTcircuit 
{ 
    int x; //shallow clone OK
    int *x2; //pointer - needs deep clone
    struct Y y; //shallow clone OK iff members of struct Y are all shallow clone OK
    struct Y *y2; //pointer type, needs deep clone
} //conclusion for this stuct - needs deep clone

struct CKTcircuit CKTcircuit_clone(struct CKTcircuit *source)
{
    struct CKTcircuit result = *source; //shallow clone
    //that has dealt with all value types e.g. ints, floats and
    //even structs that aren't pointed to and don't contain pointers
    //now need to call similar clones functions on all the pointer types
    result.pointerX = &x_clone(source->pointerX);
    return result;
}

このようなものが存在しない場合は、メモリを解放するためにカスタムの解放メソッドが必要になる場合があります。

void CKTcircuit_free(struct CKTcircuit *source)
{
    x_free(source->pointerX);
    free(*source);
}
于 2012-11-03T12:51:06.713 に答える
0

1)難しい方法:

ディープコピーの場合は、構造全体をトラバースして、一度に1つのノードで再作成する必要があります。ただし、元のデータ構造からではなく、コピーからのポインタを使用するようにしてください。

これは単純化された擬似コードの例です。

node traverse_cp(node, checked_list){
   // makes sure you don't traverse back edges twice. or you'll loop.
   if ( checked_list[node] ) return checked_list[node];


   new_node = copy_node_data(node);
   new_node.left = traverse_cp(node->left, check_list + node);
   new_node.right = traverse_cp(node->right, check_list + node);   
   return node_node;
}

2)ショートカット

A)連続メモリメモリが連続して割り当てられていることを保証できる場合(一度mallocしてから自分でメモリを渡す)、ブロック全体をmemcpyしてから、そのアドレス空間でアドレスを検索して変更するだけです。しかし、それはそれほど堅牢ではありません。

B)構造体の配列ポインタの代わりに、構造体とインデックスの事前に割り当てられた配列を使用します。しかし、それは異種データ構造では機能しません。これは基本的にあなたのプログラムの書き直しです。

于 2012-11-03T12:44:32.047 に答える