計算にはどのようなデータが必要ですか?次に、必要なデータを保持するための新しい構造体を作成できますか?
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);
}