2012-04-15 4 views
5

मैं क्लास लाइब्रेरी बनाना चाहता हूं, एक फ़ंक्शन जिसका पैरामीटर अज्ञात आकार का मैट्रिक्स है, और उपयोगकर्ता अपने स्वयं के आकार के साथ अपना मैट्रिक्स बनायेगा और इसे पास करेगा इस तरह उसकी मैट्रिक्स पर कुछ कार्य कर को यह कार्य करने के लिए, समारोहकिसी अज्ञात आकार की दो आयामी सरणी को किसी फ़ंक्शन पर

calculateDeterminantOfTheMatrix(int matrix[][]) 
{ 
    some Operations to do on matrix 
} 
+0

int ** मैट्रिक्स सिंटैक्स होगा जिसे आप ढूंढ रहे हैं। –

+1

यदि आप लोगों को मनमाने ढंग से आकार के मैट्रिक्स से गुज़रने वाले हैं, तो उन्हें # पंक्तियों और स्तंभों को भी पास कर दें। या, वैकल्पिक रूप से, 'std :: vector > ' – birryree

+2

@SteveHoward ए 2 डी सरणी C++ में पॉइंटर पर पॉइंटर को क्षय नहीं करता है। – Mahesh

उत्तर

12

बहुआयामी सरणियों बहुत अच्छी तरह से सी और सी की ++ में निर्मित घटकों द्वारा समर्थित नहीं हैं हो जाएगा। आप केवल जब आप संकलन समय पर N-1 आयाम पता एक N -dimension सरणी पारित कर सकते हैं:

calculateDeterminantOfTheMatrix(int matrix[][123]) 

हालांकि, मानक पुस्तकालय आपूर्ति std::vector कंटेनर, कि बहु आयाम सरणियों के लिए बहुत अच्छी तरह से काम करता है: आपके मामले में, गुजर vector<vector<int> > &matrix सी ++ में कार्य से निपटने का सही तरीका होगा।

int calculateDeterminantOfTheMatrix(vector<vector<int> > &matrix) { 
    int res = 0; 
    for (int i = 0 ; i != matrix.size() ; i++) 
     for(int j = 0 ; j != matrix[i].size() ; j++) 
      res += matrix[i][j]; 
    return res; 
} 

एक अतिरिक्त बोनस के रूप में, आप कार्य करने के लिए मैट्रिक्स के आयामों पारित करने के लिए की जरूरत नहीं होगी: matrix.size() पहले आयाम का प्रतिनिधित्व करता है, और matrix[0].size() दूसरे आयाम का प्रतिनिधित्व करता है।

+0

मैं घोषणा यह 'calculateDeterminantOfTheMatrix (वेक्टर > और मैट्रिक्स)' मैं सक्षम पाश के लिए उस पर हो जाएगा इस 'के लिए की तरह (मैट्रिक्स [rowNumber] [columnNumber]' –

+0

@AhmedZainElDein मैं पाशन का एक उदाहरण जोड़ा जब आप 'वेक्टर >' – dasblinkenlight

+0

में पास करते हैं तो मैट्रिक्स के तत्व 'int ** matrix' यहां काम करता है या नहीं? –

1

कई दृष्टिकोण हैं जो आप ले सकते हैं। काम करने के

  1. सी रास्ता -> एक int** पास करें, लेकिन यहाँ बेहद सतर्क। यह काफी 2 डी सरणी नहीं है। आपको इस सूचक को सही ढंग से स्मृति आवंटित करना होगा, या वैकल्पिक रूप से, आपको संकलन समय पर आकार जानने की आवश्यकता है। (उदाहरण के लिए स्थिर रूप से आकार एम * एन की सरणी आवंटित करना और फिर कुछ भी बड़ा करना)। स्मृति को गतिशील रूप से आवंटित करने के लिए, आपको पंक्तियों और स्तंभों की संख्या जानने की आवश्यकता है।

  2. सी ++ रास्ता ->#include <vector> जिसके बाद आप बस (। जब तक आप C++ 11 संकलक का उपयोग कर रहे <int> के बाद अंतरिक्ष के बारे में सावधान) vector<vector<int> > &matrix उपयोग कर सकते हैं, जो पूर्णांक वैक्टर जिनमें से एक सदिश आवंटित करेगा मूल रूप से एक है 2 डी सरणी इस मामले में स्मृति प्रबंधन की आपकी देखभाल की जाएगी।

+0

चीजों को करने का सी तरीका भी जटिल हो जाता है जब आप मानते हैं कि 2 डी सरणी पंक्ति-वार या स्तंभ-वार संग्रहीत की जा सकती है। – mdenton8

1

मैं कॉलम और पंक्ति परिभाषित के साथ मैट्रिक्स के लिए एक साधारण वर्ग रैपर लिखूंगा।

template <typename T> 
class Mat { 
    std::size_t _row; 
    std::size_t _col; 

    T *_mat_elem; 
public: 
    Mat(std::size_t r, std::size_t c) 
    : _row(r), _col(c), _mat_elem(new T[r*c] {} 
    ~Mat() {/* remember to do delete [] here */} 

    // element access, for example 
    T& at(std::size_t r, std::size_t c) 
    { 
    return *(_mat_elem+r*_col+c); 
    } 
}; 

लेकिन वास्तव में आप पहियों का पुन: आविष्कार कर रहे हैं। वहाँ मैट्रिक्स हैंडलिंग के लिए अच्छी पुस्तकालय हैं।

+0

यह दो अन्य की तुलना में एक बेहतर जवाब है। – mdenton8

2

सी समाधान:

सी में आप सरणी आकार छोड़ नहीं कर सकता (वाम-पंथी को छोड़कर) जब समारोह पैरामीटर के रूप में पारित करने।

आप लिख सकते हैं: पूर्णांक एक []

लेकिन नहीं कर सकते हैं: पूर्णांक एक [] []

सिर्फ उदाहरण के लिए: पूर्णांक एक [] [20]

यह बाधा यहां है, क्योंकि कंपाइलर को सरणी तत्वों तक पहुंचने के लिए उचित ऑफ़सेट निर्धारित करने की आवश्यकता है। हालांकि, आप इसे इस तरह से बना सकते हैं:

void print_arbitrary_2D_array(void *arr, int y, int x) 
{ 
    /* cast to 2D array type */ 
    double (*p_arr)[y][x] = (double (*)[y][x]) arr; 

    int i, j; 

    for (i = 0; i < y; ++i) { 
     for (j = 0; j < x; ++j) 
      printf(" %lf", (*p_arr)[i][j]); 
     putchar('\n'); 
    } 
} 

double arr_1[4][3] = { 
    { 3.3, 5.8, 2.3 }, 
    { 9.1, 3.2, 6.1 }, 
    { 1.2, 7.9, 9.4 }, 
    { 0.2, 9.5, 2.4 } 
}; 
double arr_2[2][5] = { 
    { 3.6, 1.4, 6.7, 0.1, 4.2 }, 
    { 8.4, 2.3, 5.9, 1.4, 8.3 } 
}; 

print_arbitrary_2D_array(arr_1, 4, 3); 
putchar('\n'); 
print_arbitrary_2D_array(arr_2, 2, 5); 
संबंधित मुद्दे