2011-12-23 16 views
28

हाय मैं सी ++ पर नौसिखिया हूं, मैं फ़ंक्शन से 2 डी सरणी वापस करने का प्रयास कर रहा हूं। वह कुछ इस तरह हैफ़ंक्शन से 2 डी सरणी लौटें

int **MakeGridOfCounts(int Grid[][6]) 
{ 
    int cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }}; 

    return cGrid; 
} 
+0

और आपका प्रश्न है? क्या यह सी या सी ++ है? – Mat

+3

यदि आप एक नौसिखिया हैं और 2 डी सरणी वापस करने की कोशिश कर रहे हैं, तो आपको [बेहतर सीखने की सामग्री] की आवश्यकता हो सकती है (http://stackoverflow.com/q/388242/46642)। Arrays शुरुआती-अनुकूल नहीं हैं, और जब वे बहुआयामी हैं तो भी कम। –

+0

यहां एक ही प्रश्न का [सी संस्करण] है (http://stackoverflow.com/questions/8617889/return-a-2d-array-from-a- कार्यक्षमता)। –

उत्तर

4

क्या आप (करने का प्रयास कर) कर रहे हैं/अपने स्निपेट में कर समारोह, जिस पर सभी की सलाह नहीं दी है से एक स्थानीय चर वापस जाने के लिए है - न ही यह के अनुसार की अनुमति दी मानक।

आप अपने समारोह से एक int[6][6] बनाने के लिए चाहते हैं, तो आप या तो मुफ्त की दुकान पर इसके लिए स्मृति को आबंटित करना होगा (यानी। नई टी/malloc या इसी तरह के समारोह का उपयोग कर), या एक में पारित MakeGridOfCounts पर पहले से ही स्मृति का आवंटित टुकड़ा आवंटित किया गया है।

+0

ठीक है तो आप सी में स्मृति आवंटित करने और इसे वापस करने का मतलब है? – user1047092

+0

@ user1047092 हां, जब आप इसके साथ काम करते हैं तो आवंटित स्मृति को 'मुक्त' न भूलें, या 'हटाएं' (यदि आप इस प्रश्न के शीर्षक के रूप में सी ++ लिख रहे हैं)। –

+1

नहीं, यदि आप C++ का उपयोग कर रहे हैं तो कुछ भी 'हटाएं' नहीं। कभी। हमेशा संसाधन-प्रबंधन वर्ग का उपयोग करें। – Puppy

3

वह कोड काम नहीं करेगा, और यदि आप इसे ठीक करते हैं तो यह उचित सी ++ सीखने में आपकी सहायता नहीं करेगा। यह बेहतर है अगर आप कुछ अलग करते हैं। कच्चे सरणी (विशेष रूप से बहु-आयामी सरणी) कार्यों को सही ढंग से पारित करना मुश्किल होता है। मुझे लगता है कि आप किसी ऑब्जेक्ट से शुरू करने से बहुत बेहतर होंगे कि एक सरणी का प्रतिनिधित्व करता है लेकिन सुरक्षित रूप से कॉपी किया जा सकता है। std::vector के लिए प्रलेखन देखें।

अपने कोड में, आप vector<vector<int> > का उपयोग कर सकते हैं या आप 36-तत्व vector<int> के साथ 2-डी सरणी अनुकरण कर सकते हैं।

28

यह कोड एक 2 डी सरणी देता है।

#include <cstdio> 

    // Returns a pointer to a newly created 2d array the array2D has size [height x width] 

    int** create2DArray(unsigned height, unsigned width) 
    { 
     int** array2D = 0; 
     array2D = new int*[height]; 

     for (int h = 0; h < height; h++) 
     { 
      array2D[h] = new int[width]; 

      for (int w = 0; w < width; w++) 
      { 
        // fill in some initial values 
        // (filling in zeros would be more logic, but this is just for the example) 
        array2D[h][w] = w + width * h; 
      } 
     } 

     return array2D; 
    } 

    int main() 
    { 
     printf("Creating a 2D array2D\n"); 
     printf("\n"); 

     int height = 15; 
     int width = 10; 
     int** my2DArray = create2DArray(height, width); 
     printf("Array sized [%i,%i] created.\n\n", height, width); 

     // print contents of the array2D 
     printf("Array contents: \n"); 

     for (int h = 0; h < height; h++) 
     { 
      for (int w = 0; w < width; w++) 
      { 
        printf("%i,", my2DArray[h][w]); 
      } 
      printf("\n"); 
     } 

      // important: clean up memory 
      printf("\n"); 
      printf("Cleaning up memory...\n"); 
      for ( h = 0; h < height; h++) 
      { 
      delete [] my2DArray[h]; 
      } 
      delete [] my2DArray; 
      my2DArray = 0; 
      printf("Ready.\n"); 

     return 0; 
    } 
0

आप जो भी परिवर्तन समारोह में होगा persist.So जाएगा anything.You लौट 2 डी सरणी पारित कर सकते हैं और इसे बदलने के लिए जब भी आप की तरह होगा की कोई जरूरत नहीं है।

void MakeGridOfCounts(int Grid[][6]) 
    { 
     cGrid[6][6] = {{0, }, {0, }, {0, }, {0, }, {0, }, {0, }}; 

    } 

या

void MakeGridOfCounts(int Grid[][6],int answerArray[][6]) 
    { 
    ....//do the changes in the array as you like they will reflect in main... 
    } 
-1
int** create2DArray(unsigned height, unsigned width) 
{ 
    int** array2D = 0; 
    array2D = new int*[height]; 

    for (int h = 0; h < height; h++) 
    { 
      array2D[h] = new int[width]; 

      for (int w = 0; w < width; w++) 
      { 
       // fill in some initial values 
       // (filling in zeros would be more logic, but this is just for the example) 
       array2D[h][w] = w + width * h; 
      } 
    } 

    return array2D; 
} 

int main() 
{ 

    printf("Creating a 2D array2D\n"); 
    printf("\n"); 

    int height = 15; 
    int width = 10; 
    int** my2DArray = create2DArray(height, width); 
    printf("Array sized [%i,%i] created.\n\n", height, width); 

    // print contents of the array2D 
    printf("Array contents: \n"); 

    for (int h = 0; h < height; h++) 
    { 
     for (int w = 0; w < width; w++) 
     { 
       printf("%i,", my2DArray[h][w]); 
     } 
     printf("\n"); 
    } 

    return 0; 
} 
+0

यह मेरे लिए ठीक काम करता है !!! – user3785412

+2

आपके उत्तर में दो बड़ी कमीएं थीं: 1।आप केवल स्पष्टीकरण के बिना कोड देते हैं, और 2. आपका कोड स्वरूपण गलत था ताकि मार्कडाउन इसे कोड ब्लॉक के रूप में पहचाना न सके। उचित स्वरूपण के लिए, आपको कोड की प्रत्येक पंक्ति के लिए चार रिक्त स्थान इंडेंटेशन की आवश्यकता है। ध्यान दें कि आप अपने कोड का चयन करके और फिर संपादकीय में कोडब्लॉक बटन पर क्लिक करके इन चार रिक्त स्थान जोड़ सकते हैं (ब्रेसिज़ '{}' वाला एक)। मैंने तुम्हारे लिए तय किया है। लापता स्पष्टीकरण देने के लिए आपका है। Ps: मैंने downvote नहीं किया था। – cmaster

+0

यह उत्तर नीचे दिए गए सॉफ़्टवेयर_Designer द्वारा एक की प्रतिलिपि/पेस्ट नहीं है? – Matt

2

एक बेहतर विकल्प संकेत की ओर इशारा का उपयोग करने के std::vector उपयोग करने के लिए है। यह स्मृति आवंटन और हटाने के विवरण का ख्याल रखता है।

std::vector<std::vector<int>> create2DArray(unsigned height, unsigned width) 
{ 
    return std::vector<std::vector<int>>(height, std:vector<int>(width, 0)); 
} 
0

सभी पंक्तियों के तत्वों को शुरू करने की ओर इशारा करते संकेत की एक सरणी लौटने 2 डी सरणी लौटने का केवल सभ्य तरीका है।

+2

इसमें और विवरण जोड़ें, यह एकमात्र सभ्य तरीका क्यों है, दूसरों को क्यों नहीं – piyushj

संबंधित मुद्दे