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 个成员并不是世界末日:

可能只需要咬紧牙关,了解规则并使用以下方法进行深度克隆:

注释成员以了解每个结构是浅克隆 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);
}
于 2012-11-03T12:51:06.713 回答
0

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 回答