我有一个定义为
的结构struct CKTcircuit
{
more than a 100 pointers and objects of different types of structure.
this structure has around 500 lines just declaring variables & pointers.
}
现在我有一个这种类型的对象被实例化。
我必须创建一个相同类型的副本。
任何解决方案我该怎么做?
P.S。:我需要这样做,因为我需要启动另一个线程进行计算并修改CKTcircuit对象。
答案 0 :(得分:1)
您的计算需要哪些数据?您可以创建一个新的结构来保存您想要的数据:
struct WorkingData
{
//data needed for calculations
}
struct CKTcircuit source = //whatever;
struct WorkingData work;
CKTcircuit_populateWorkingData(source, &work);
calculate(&work);
或者,使用CKTcircuit
作为工作数据,但要小心克隆包含指针的结构。
struct CKTcircuit source = //whatever;
struct CKTcircuit work;
CKTcircuit_populateWorkingData(source, &work);
calculate(&work);
但是,100名成员不是世界末日:
可能只需要按照这样的方法编写子弹,了解规则和深度克隆:
注释成员以了解每个结构是否是浅克隆OK,或者需要深度克隆。
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);
}
答案 1 :(得分:-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一次,然后自己分发内存),那么你可以只记忆整个块,然后搜索该地址空间中的地址,然后修改它们。但是,这不是很强大。
B)结构数组 使用预分配的结构和索引数组而不是指针。但这对于异构数据结构不起作用。这基本上是对你的程序的重写。