2010-08-24 11 views
7

++ मैं एक डबल मैट्रिक्स (2-आयामी डबल सरणी) को प्रारंभ करना चाहते है कि मैं सामान्य रूप से तो जैसे संकेत दिए बिना करना होगा:सी ++ बहुआयामी सरणी प्रारंभ सी में

double data[4][4] = { 
    1,0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
}; 

हालांकि, बाद से मैं वापस जाने के लिए चाहते हैं और इसे कार्यों में पास करें, मुझे इसे double** पॉइंटर के रूप में चाहिए। इसलिए, मूल रूप से मुझे डेटा को एक अच्छे तरीके से (ऊपर के रूप में) प्रारंभ करने की आवश्यकता है, लेकिन उसके बाद मुझे पॉइंटर को 2 डी-सरणी में सहेजने की आवश्यकता होती है जब फ़ंक्शन निकलता है तो डेटा खोने के बिना।

इस पर कोई मदद? :-)

+4

क्यों आप एक 'डबल ** के रूप में यह क्या ज़रूरत है' (संकेत के साथ, और आप के लिए क्या पूछा करता है)? 'डबल (*) [4]' के साथ क्या गलत है? –

+0

यह सी ++ है। क्या यह एक वर्ग हो सकता है, इस सरणी के साथ सदस्य के रूप में, जब आप किसी सदस्य फ़ंक्शन को कॉल करते हैं तो संदर्भ वापस लेता है? –

+0

संभावित डुप्लिकेट [पॉइंटर के माध्यम से दो-आयामी सरणी पास करना] (http: // stackoverflow।कॉम/प्रश्न/3515045/गुजरने वाले दो-आयामी-सरणी-के-पॉइंटर) यह सी है, सी ++ नहीं, लेकिन यह बिल्कुल वही समस्या है। –

उत्तर

9

जब तक आप संकेत के बारे में विशेष रूप से कर रहे हैं, मैं एक संदर्भ यहाँ

void init(double (&r)[4][4]){ 
    // do assignment 
    r[0][0] = 1; 
} 

int main(){ 
    double data[4][4] = { 
     1.0,0,0, 
     0,1,0,0, 
     0,0,1,0, 
     0,0,0,1 
    }; 

    init(data); 
} 

पसंद करेंगे वैसे, अगर आप इस तरह से एक कार्य करने के लिए इसे पारित, आप होगा "बताए" के बजाय "आरंभ" ।

+0

मुझे लगता है कि यह जवाब गर्म हो रहा है। यह वह हो सकता है जिसे मैं ढूंढ रहा हूं! – Felix

+0

प्रतिलिपि फ़ंक्शन के साथ "init" को प्रतिस्थापित करके, यह मॉडल मेरी समस्या को सुंदरता से बदलता है। धन्यवाद! – Felix

1

इस तरह से अस्थायी चर प्रारंभ करें और फिर इसे गतिशील आवंटित स्मृति में कॉपी करें।

3

double (*)[4] बहुत अलग से double **

बस दोनों के लिए स्मृति में अपने युगल के लेआउट स्केच और आप समझ क्यों उन्हें दूसरे के स्थान पर उपयोग नहीं कर सकते चाहिए।

+0

क्योंकि मुझे "डबल (*) [4]" नहीं पता या समझ में नहीं आता है, मैं इसे स्केच नहीं कर सकता। इसका क्या मतलब है? – Felix

+0

@ फ़ेलिक्स: इसका अर्थ है "डबल की लम्बाई -4 सरणी सूचक"। –

5

क्या आपके सभी matrices 4x4 हैं? एक टेम्पलेट

class Matrix 
{ 
    double m[4][4]; 
    // ... 
}; 

void function(const Matrix& matrix) 
{ 
    // ... 
} 

आप विभिन्न आयामों की मैट्रिक्स की जरूरत है, लेकिन वे संकलन समय पर जाना जाता है, का उपयोग करें::

template <size_t n> 
class Matrix 
{ 
    double m[n][n]; 
    // ... 
}; 

template <size_t n> 
void function(const Matrix<n,n>& matrix) 
{ 
    // ... 
} 
तो मैं बस एक वर्ग एक double[4][4] सदस्य के साथ चारों ओर परिभाषित करेगा और पारित उस वर्ग की वस्तुओं

यह आपको सरणी से पॉइंटर क्षय से निपटने से बचाता है और कोड को और अधिक पठनीय IMHO बनाता है।

4

सबसे पहले, डबल आयामी सरणी की घोषणा सही नहीं है। यह इस प्रकार है के रूप में किया जाना चाहिए:

double data[4][4] = { 
     {1.0,0,0,0}, 
     {0,1,0,0}, 
     {0,0,1,0}, 
     {0,0,0,1} 
    }; 

दूसरा एक समारोह में इसे पारित आप इसे पसंद

show(data); 

समारोह घोषणा में क्या कर सकते हैं के लिए, आप के साथ एक सरणी के रूप में तर्क देने की आवश्यकता पहले को छोड़कर सभी आयाम देना। तो घोषणा देखो की तरह होगा:

void show(double arr[][4]) 
{ 
    ... 
    ... 
} 

यह एक संदर्भ wihout आप एक सूचक का उपयोग करने की आवश्यकता होगी, के रूप में सरणी से गुजरता है।

आशा है कि इससे मदद मिलेगी।

+0

धन्यवाद! वह एक-पंक्ति प्रारंभिक था जिसे मैं ढूंढ रहा था। –

0

कैसे इस बारे में

#include <iostream> 

using namespace std; 

int refer(double (*a)[4]) 
{ 
    cout<<"First value is "<<(*a)[0]; 
    (*a)[0] = 37; 
    cout<<"changed value is "<<(*a)[0]; 
} 

int main() 
{ 
    double data[4][4] = { 
    1.0,0,0, 
    0,1,0,0, 
    0,0,1,0, 
    0,0,0,1 
    }; 
    refer(data); 
    return 0; 
} 
संबंधित मुद्दे