2011-06-12 14 views
9

में एक फ़ंक्शन में 2 डी सरणी पास करना प्रोग्राम के नीचे (फ़ंक्शन में सरणी के चारों ओर जाने के लिए एक खिलौना प्रोग्राम) संकलित नहीं होता है। मुझे स्पष्ट करने दें, क्यों संकलक संकलन करने में असमर्थ (क्योंकि या तो तकनीकी कारण से या मानक कारण की वजह से?) हैसी प्रोग्राम

मैं भी संकेत दिए गए/बहु आयामी सरणी समझा (के रूप में मैं पर अस्थिर कर रहा हूँ कुछ किताब पर नजर डालेंगे इन), लेकिन यहां किसी भी ऑफ-द-शेल्फ पॉइंटर्स उपयोगी होना चाहिए।

void print2(int ** array,int n, int m); 

main() 
{ 
    int array[][4]={{1,2,3,4},{5,6,7,8}}; 
    int array2[][2]={{1,2},{3,4},{5,6},{7,8}}; 
    print2(array,2,4); 
} 

void print2(int ** array,int n,int m) 
{ 
    int i,j; 
    for(i=0;i<n;i++) 
    { 
     for(j=0;j<m;j++) 
     printf("%d ",array[i][j]); 

     printf("\n"); 
    } 
} 
+1

कंपाइलर त्रुटि संदेश क्या है? –

उत्तर

12

यह (सामान्य रूप से) c faq में समझाया गया है। संक्षेप में, एक संकेतक को केवल एक बार (एक बार क्षय होने के बाद, परिणामी सूचक अधिक क्षय नहीं होगा) के लिए एक सरणी क्षय हो जाती है।

सरणियों की एक सरणी (अर्थात सी में एक दो आयामी सरणी) एक सरणी, नहीं एक सूचक करने के लिए एक सूचक के लिए सूचक में decays ।

सबसे आसान तरीका है इसे हल करने:

int **array; /* and then malloc */ 
+0

http://stackoverflow.com/questions/16943909/manipulate-multidimensional-array-in-a- कार्यक्षमता – Dchris

5

C99 में, कि प्राप्त होता है "चर लंबाई सरणियों" कार्यों के लिए एक सरल नियम के रूप में पहली सीमा की घोषणा:

void print2(int n, int m, int array[n][m]); 

और फिर अपने कार्य केवल वही काम करना चाहिए जैसा आप उम्मीद करेंगे।

संपादित करें: आम तौर पर आपको उस क्रम में देखना चाहिए जिसमें आयाम निर्दिष्ट है। (और मुझे :)

+0

क्या होगा यदि मैं फ़ंक्शन से आयाम पास नहीं करना चाहता हूं? – Dchris

+0

@Dchris, क्या आप कृपया अधिक स्पष्ट हो सकते हैं कि आप क्या जानना चाहते हैं? आप आयाम बिल्कुल नहीं देना चाहते हैं, या आप निश्चित आयामों में गुजरना चाहते हैं? –

+0

मैं निश्चित आयामों में गुजरना चाहता हूं – Dchris

0

अपने कोड में डबल पॉइंटर 2 डी सरणी तक पहुंचने के लिए उपयुक्त नहीं है क्योंकि यह इसके हॉप आकार यानी कॉलम की संख्या नहीं जानता है। एक 2 डी सरणी एक आवंटित आवंटित स्मृति है।

निम्न टाइपकास्ट और 2 डी सर पॉइंटर समस्या का समाधान करेगा।

# define COLUMN_SIZE 4 
void print2(int ** array,int n,int m) 
{ 
    // Create a pointer to a 2D array 
    int (*ptr)[COLUMN_SIZE]; 
    ptr = int(*)[COLUMN_SIZE]array; 

    int i,j; 
    for(i = 0; i < n; i++) 
    { 
     for(j = 0; j < m; j++) 
     printf("%d ", ptr[i][j]); 
     printf("\n"); 
    } 
} 
संबंधित मुद्दे