2010-10-10 6 views
11

से तत्वों की एक श्रृंखला की प्रतिलिपि करने के memcpy का उपयोग करते हुए कहते हैं कि हम दो सरणियों है:एक सरणी

double *matrix=new double[100]; 
double *array=new double[10]; 

और हम memcpy का उपयोग कर मैट्रिक्स [80:89] सरणी से 10 तत्वों की प्रतिलिपि बनाना चाहते।

कोई त्वरित समाधान?

+1

क्या कोड संकलित होगा? –

+1

मुझे लगता है कि यह एक सरणी की वैध सी ++ घोषणा भी नहीं है। memcpy चर की एक प्रारंभ और लंबाई + आकार की आवश्यकता है। पैरामीटर्स को मैट्रिक्स = src, array = dest, 80 = start, 10 = len, sizeof (double) = size जैसे कुछ होना चाहिए। $ man memcopy –

+5

क्या आपको शायद 'डबल मैट्रिक्स [100];' और 'डबल सरणी [10]; '? –

उत्तर

10
memcpy(array, matrix+80, sizeof(double) * 10); 
21

यह std::copy उपयोग करने के लिए आसान है:

std::copy(matrix + 80, matrix + 90, array); 

यह क्लीनर है क्योंकि आप केवल तत्वों की रेंज में बताने की कॉपी करने के लिए, नहीं बाइट की संख्या। इसके अलावा, यह सभी प्रकार के लिए काम करता है जिन्हें कॉपी किया जा सकता है, न केवल पीओडी प्रकार।

15
memcpy(array, &matrix[80], 10*sizeof(double)); 

लेकिन (के बाद से आप कहते हैं कि सी ++) यदि आप एक सी ++ फ़ंक्शन का उपयोग कर बेहतर प्रकार सुरक्षा के बजाय पुराने सी memcpy होगा:

#include <algorithm> 
std::copy(&matrix[80], &matrix[90], array); 

नोट समारोह एक सूचक "लेता है कि एक अतीत जिस श्रेणी का आप उपयोग करना चाहते हैं उसका अंत "। अधिकांश एसटीएल कार्य इस तरह से काम करते हैं।

+5

'और मैट्रिक्स [एन] 'के बजाय' मैट्रिक्स + एन' 'का उपयोग करने का एक फायदा यह है कि आकार' एम 'की एक सरणी के लिए,' मैट्रिक्स + एम' की अनुमति है लेकिन' और मैट्रिक्स [ एम] 'नहीं है (क्योंकि उत्तरार्द्ध तत्व को एक-अतीत के अंत में एक सूचक को संदर्भित करता है)। –