7

मुझे एक परियोजना के साथ समस्या है। मुझे कुछ पूर्वानुमान त्रुटि संग्रहीत करने के लिए एक चर आकार 2 डी सरणी बनाना है .. तो यह छवियों के बारे में है। परेशानी यह है कि मुझे विभिन्न आकारों की छवियों को लोड करना होगा ताकि प्रत्येक छवि के लिए मुझे 2 डी सरणी को पिक्सेल की अनुरूप संख्या के साथ फ़ाइल में प्राप्त करना होगा .. मैंने आपके प्रश्नों के बीच खोज की है, लेकिन यह नहीं है कि मैं क्या देख रहा हूं के लिए क्या कोई मेरी मदद कर सकता है?सी में एक चर आकार 2 डी सरणी कैसे घोषित करें?

आप

उत्तर

0

आप गतिशील स्मृति को आबंटित करने की जरूरत है धन्यवाद। डबल पॉइंटर तर्क का प्रयोग करें।

पूर्व:

int n=10; <<-u can change this. 
int **a; 
a=(int **)malloc(sizeof(*int)*n); 
for (int i=0;i<n;i++){ 
a[i]=(int *)malloc(sizeof(int)*n);// or *(a+i) 
} 
+1

कोई डबल पॉइंटर एक बहुआयामी सरणी नहीं है। –

+0

निश्चित रूप से नहीं, लेकिन आप इसे एक सरणी की तरह व्यवहार कर सकते हैं – Akshay

+0

जब आप बस एक का उपयोग कर सकते हैं तो 2 डी सरणी के अनुकरण का उपयोग क्यों करें? –

6

आप समारोह दायरे में एक आधुनिक सी संकलक है (कम से कम C99) के रूप में के रूप में सरल है:

unsigned arr[n][m]; 

यह एक चर लंबाई सरणी कहा जाता है (VLA)। यदि सरणी बहुत बड़ी है तो इसमें समस्या हो सकती है। तो तुम क्या कर सकता है यदि आप बड़े चित्र हैं:

unsigned (*arr)[m] = malloc(sizeof(unsigned[n][m])); 

और बाद में

free(arr); 
+0

याद रखें कि ऊपर वर्णित चर लंबाई लंबाई सरणी पर आवंटित की जाएगी। दूसरी बात जो सवाल के लिए बहुत प्रासंगिक नहीं है वह यह है कि सी ++ 0 एक्स इस सुविधा का समर्थन नहीं करता है (हालांकि यह एक सी सवाल है इसलिए ठीक काम करता है) – Yavar

+0

@Yavar, यही कारण है कि मैंने 'malloc' के साथ आवंटित संस्करण का भी उल्लेख किया है। । और फिर भी यह एक "विविध रूप से संशोधित प्रकार" है। और सी ++ में बहुआयामी सरणी करने के अन्य तरीके स्पष्ट रूप से हैं, इसलिए हाँ, यह बिल्कुल प्रासंगिक नहीं है। –

0

एक उदाहरण के लिए यदि आप एक 2 डी पूर्णांक सरणी आवंटन पर विचार करें:

int **array1 = (int**) malloc (nrows *sizeof(int*)); 

for (int i=0; i<nrows;i++) 
    array1[i]=(int*) malloc (ncols *sizeof(int)); 

जहां nrows -> कोई पंक्तियों के ncols -> स्तंभों में से कोई नहीं है या # परिभाषा

2

यदि आपको स्मृति होने की आवश्यकता है, तो आपके पास कुछ जोड़े हैं विकल्प।

आप गतिशील स्मृति के एक विशाल खंड आवंटित कर सकता है, और फिर मैन्युअल रूप से अपने ऑफसेट की गणना, इसलिए जैसे:

int **arrp = malloc(sizeof *arrp * rows); 
... 
for (i = 0; i < rows; i++) 
    arrp[i] = &arr[i * rows]; 
... 
arrp[i][j] = ...; 
:

size_t rows, cols; 
... 
int *arr = malloc(sizeof *arr * rows * cols); 
... 
arr[i * rows + j] = ...; // logically equivalent to arr[i][j] 

आप मुख्य सरणी में संकेत की एक दूसरी सरणी सेट कर सकते हैं

याद रखना कि आपको arr और arrp दोनों को खाली करना होगा।

आप एक C99 कार्यान्वयन है, तो आप बस एक सूचक एक VLA करने के लिए सेट कर सकते हैं, तो जैसे:

int (*arrp)[cols] = (int (*)[cols]) arr; 
... 
arrp[i][j] = ...; 

ध्यान दें कि इस मामले में, आप एक उच्च माध्यमिक सरणी के लिए किसी भी स्मृति का आवंटन नहीं कर रहे हैं, न ही आपको मुख्य सरणी में पॉइंटर्स की मैन्युअल रूप से गणना करने की आवश्यकता है; आपको बस के समान स्थान पर arrp सेट करना है और पॉइंटर अंकगणित के नियमों को सभी काम करने दें।

छवियों कि बड़ा नहीं हैं, तो आप बस एक VLA (फिर से, C99 या बाद में) सेट कर सकते हैं:

int arr[rows][cols]; 

लेकिन व्यवहार में यह एक अच्छा विचार नहीं है, ढेर फ्रेम आमतौर पर आकार में काफी सीमित हैं।

+0

आपके तीसरे मामले में मुझे लगता है कि आवंटन बेहतर है क्योंकि मैंने इसे अपने उत्तर में दिया था। बस 'malloc' सीधे, कास्ट करने की कोई ज़रूरत नहीं है, यह केवल obfuscates। –

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