सी

2013-02-17 68 views
5

में पॉइंटर प्वाइंट के साथ संरचना की गहरी प्रतिलिपि मुझे आपकी मदद चाहिए!सी

मैं इस तरह एक struct कॉपी किए जाने वाले:

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 की deepcopy के लिए मेरे समाधान - सभी मदद के लिए 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)); 
} 
+0

आपको ** vertex की प्रतिलिपि बनाने की आवश्यकता है? – amrfaissal

+0

सभी उत्तरों के लिए धन्यवाद (@ स्पार्की, @ फ़ून, @eznme)। मुझे यह मिला :-)
'dst-> vertex = (long *) malloc (dst-> num_vertex * 3 * sizeof (long)); के लिए (लंबा i = 0; i < src-> num_vertex; i ++) {dst-> vertex [i] = (लंबा) malloc (3 * आकार (लंबा)); memcpy (dst-> vertex [i], src-> vertex [i], 3 * आकार (लंबा)); } ' – romi1013

उत्तर

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. 

उम्मीद है कि इससे मदद मिलती है।

2

मूल जवाब:

कोने की एक सरणी के लिए शिखर अंक मान लिया जाये, और कहा कि प्रत्येक vertice 3 देशांतर शामिल (एक्स , 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_type *) malloc (dst-> num_vertex * sizeof (vertex_type); memcpy (dst, src, dst-> num_vertex * sizeof (vertex_type));

+0

कुछ अन्य उत्तरों की समीक्षा, मैंने दो मामलों के बारे में सोचा नहीं था। यह उत्तर मानता है कि वर्टेक्स सरणी प्रत्येक ऑब्जेक्ट के लिए अद्वितीय है (या आपको वास्तव में इसे गहराई से करने की आवश्यकता नहीं होगी)। यह भी मानता है कि डीएसटी एक नया नया सूचक है (लेकिन यह उस स्मृति के वैध सेट को इंगित करता है जिसे आपने या तो स्टॉल पर बनाया है या बनाया है); यदि यह एक नई नई वस्तु नहीं है, तो आप स्पार्की के दृष्टिकोण के साथ जाना चाहेंगे। ध्यान दें कि आपको या तो जांचना चाहिए कि dst == src अगर डीएसटी को एक नई नई वस्तु होने की गारंटी नहीं है या कम से कम इसे फ़ंक्शन में दस्तावेज़ न करें, अन्यथा आप स्मृति को रिसाव करेंगे। – Foon

+0

यदि आपका स्ट्रक्चर वर्टेक्स_टाइप {लांग एक्स, लांग वाई, लांग जेड)} था, तो आप शायद कोड साफ़ कर लेंगे, जिसका उपयोग आप बाध्यकारी बक्से के लिए लंबे [3] के बजाय करेंगे और लंबे समय के बजाय * vertex_type के रूप में उपयोग करेंगे; इस मामले में, आप करेंगे (vertex_type *) malloc (dst-> num_vertex * sizeof (vertex_type); – Foon

+0

सही है। वर्टेक्स सरणी प्रत्येक ऑब्जेक्ट के लिए अद्वितीय है। प्रत्येक ऑब्जेक्ट में num_vertex वर्टिस होते हैं। प्रत्येक वर्टेक्स एक 3 डी कोऑर्डिनेट (लंबा)। तो आपका पहला समाधान काम नहीं करता है। अगर मैं वर्टेक्स बदलता हूं, तो मैं इसे दोनों ऑब्जेक्ट्स में इस समाधान के साथ बदलता हूं। – romi1013

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;