2011-02-12 16 views
24

मैं एक 2 डी सरणी घोषित करना चाहता था और लूप को चलाने के बिना इसे मान असाइन करना चाहता था।2 डी सरणी मान C++

मैंने सोचा कि मैं निम्नलिखित विचार

int array[5] = {1,2,3,4,5}; 

कौन सा 2 डी सरणी प्रारंभ करने के साथ-साथ ठीक काम करता है के लिए इस्तेमाल किया जा सकता था। लेकिन जाहिर है कि मेरे कंपाइलर को यह पसंद नहीं है।

/* 
1 8 12 20 25 
5 9 13 24 26 
*/ 

#include <iostream.h> 

int main() 
{ 
    int arr[2][5] = {0}; // This actually initializes everything to 0. 
    arr [1] [] = {1,8,12,20,25}; // Line 11 
    arr [2] [] = {5,9,13,24,26}; 
    return 0; 
} 

जम्मू: \ सीपीपी \ ग्रिड> bcc32.exe Grid.cpp

बोर्लेन्ड सी ++ के लिए Win32 कॉपीराइट (c) को 1993, 2000 Borland 5.5.1

Grid.cpp:

त्रुटि E2188 Grid.cpp 11: समारोह मुख्य() में अभिव्यक्ति वाक्य रचना

त्रुटि E2188 Grid.cpp 12: समारोह मुख्य में अभिव्यक्ति वाक्य रचना()

चेतावनी W8004 Grid.cpp 14: 'आगमन' एक मूल्य है कि है संकलित में funct में आयन मुख्य()

* 2 त्रुटियों इस्तेमाल किया *

कृपया के रूप में मदद कभी नहीं असाइन किया गया है मेरे मूल्यों के सेट के साथ 2 डी सरणी को प्रारंभ करने का सही तरीका क्या है। सरणियों की एक सरणी के रूप में एक 2 डी सरणी के

उत्तर

41
इस तरह

: जो एक प्रयोग कर रहे हैं:

int main() 
{ 
    int arr[2][5] = 
    { 
     {1,8,12,20,25}, 
     {5,9,13,24,26} 
    }; 
} 

यह आपके सी ++ पाठ्यपुस्तक द्वारा कवर किया जाना चाहिए?

वैसे भी, बेहतर, std::vector या कुछ तैयार किए गए मैट्रिक्स क्लास का उपयोग करने पर विचार करें। बूस्ट से

+0

धन्यवाद। मैं सी ++ वॉल 1 में सोचने की सोच रहा हूं। लेकिन मुझे नहीं लगता कि यह विशिष्ट में 2 डी सरणी के लिए एक अध्याय है। –

+0

क्या पहले सरणी घोषित करना संभव है और फिर बाद में असाइन करना संभव है? – ffledgling

+0

@Ayos: हाँ, अगर आप एक समय में अलग-अलग आइटम असाइन करते हैं। पूरे शेबैंग को असाइन करने के लिए आपको सी ++ 11 और 'स्ट्रक्चर' में लिपटे सरणी की आवश्यकता है। तो फिर आप केवल 'std :: array' का उपयोग करेंगे। ठीक है, कोशिश कर रहा है, यह g ++ 4.7.2 के साथ ठीक संकलित करता है लेकिन विज़ुअल सी ++ के साथ (अभी तक) नहीं (मैंने नवंबर 2012 सीटीपी का उपयोग किया)। इसलिए थोक असाइनमेंट अभी तक बहुत पोर्टेबल नहीं लगता है। –

9

उचित तरीके से सी में एक बहुआयामी सरणी को प्रारंभ करने के लिए या सी ++

int arr[2][5] = {{1,8,12,20,25}, {5,9,13,24,26}}; 

आप भी उच्च आयामी सरणियों प्रारंभ करने में अगर आप चाहते हैं यह एक ही चाल का उपयोग कर सकते है।

इसके अलावा, अपने प्रारंभिक कोड में सावधान रहें - आप इसे शुरू करने के लिए सरणी में 1-अनुक्रमित ऑफसेट का उपयोग करने का प्रयास कर रहे थे। यह संकलित नहीं हुआ, लेकिन अगर ऐसा हुआ तो इससे समस्याएं पैदा हो जाएंगी क्योंकि सी सरणी 0-अनुक्रमित हैं!

0

एक विकल्प आपके 2 डी सरणी को 1 डी सरणी के रूप में प्रस्तुत करना है। यह तत्व-वार संचालन को और अधिक कुशल बना सकता है। आपको शायद इसे कक्षा में लपेटना चाहिए जिसमें चौड़ाई और ऊंचाई भी हो।

एक और विकल्प 0 डीके रूप में 2 डी सरणी का प्रतिनिधित्व करना है। यह आपको सरणी अंकगणितीय के लिए एसटीएल के एल्गोरिदम का उपयोग करने देगा, और वेक्टर आपके लिए मेमोरी प्रबंधन का भी ख्याल रखेगा।

8

बस यह इंगित करना चाहते हैं कि आपको सरणी के सभी आयाम निर्दिष्ट करने की आवश्यकता नहीं है।

बाएंतम आयाम को संकलक द्वारा 'अनुमानित' किया जा सकता है।

#include <stdio.h> 
int main(void) { 
    int arr[][5] = {{1,2,3,4,5}, {5,6,7,8,9}, {6,5,4,3,2}}; 
    printf("sizeof arr is %d bytes\n", (int)sizeof arr); 
    printf("number of elements: %d\n", (int)(sizeof arr/sizeof arr[0])); 
    return 0; 
} 
संबंधित मुद्दे