2010-10-11 20 views
18

मैंने कोशिश करने की कोशिश की है लेकिन मुझे एक निश्चित उत्तर के साथ कुछ भी नहीं मिला है। मुझे पता है कि मेरी समस्या मुश्किल नहीं हो सकती है। शायद यह है कि मैं थक गया हूँ ..बहुआयामी सरणी में पॉइंटर घोषित करना और सरणी आवंटित करना

असल में, मैं एक 2 आयामी सरणी में एक सूचक घोषित करना चाहता हूं। मैं इसे इस तरह से करना चाहता हूं क्योंकि आखिर में मुझे सरणी का आकार बदलना होगा। मैं एक 1 डी सरणी के साथ सफलतापूर्वक निम्नलिखित किया है:

int* array; 
array = new int[somelength]; 

मैं एक 2 डी सरणी के साथ निम्न करना चाहते हैं, लेकिन यह संकलन नहीं होगा:

int* array; 
array = new int[someheight][somewidth]; 

संकलक मुझे बताते हुए एक त्रुटि देता है कि 'somewidth' निरंतर अभिव्यक्ति में प्रकट नहीं हो सकता है। मैंने ** और [] [] के संयोजनों के सभी प्रकार की कोशिश की है, लेकिन उनमें से कोई भी काम नहीं कर रहा है। मुझे पता है कि यह जटिल नहीं है ... किसी भी मदद की सराहना की है।

उत्तर

12

मुझे पता चला कि यह प्राचीन उत्तर अभी भी पढ़ा जाता है, जो गलत है क्योंकि यह शर्म की बात है। इसके बजाय सभी वोटों के साथ the answer below पर देखें।


पॉइंटर सिंटैक्स पर पढ़ें, आपको सरणी की सरणी की आवश्यकता है। पॉइंटर के सूचक के समान ही चीज है।

int width = 5; 
int height = 5; 
int** arr = new int*[width]; 
for(int i = 0; i < width; ++i) 
    arr[i] = new int[height]; 
+2

क्या आपने इसे आजमाया? यह संकलित नहीं होता है (यदि ऊंचाई और चौड़ाई दोनों चर हैं) –

+0

हाँ मैंने कोशिश की है और अभी भी संकलक के साथ एक ही त्रुटि प्राप्त है। यह कहेंगे कि "चौड़ाई 'निरंतर अभिव्यक्ति में प्रकट नहीं हो सकती है" – vince88

+1

यदि मैं इस सरणी के तत्व को एक्सेस करना चाहता हूं तो यह केवल arr [width] [ऊंचाई] होगा? – vince88

5

here से उदाहरण का उपयोग करने के लिए, साथ वाक्यांश "दो आयामी गतिशील सरणी" googling के कुछ सेकंड के बाद एक के लिए तैयार:

int **dynamicArray = 0; 

// memory allocated for elements of rows. 
dynamicArray = new int *[ROWS]; 

// memory allocated for elements of each column. 
for(int i = 0 ; i < ROWS ; i++) { 
    dynamicArray[i] = new int[COLUMNS]; 
} 

// free the allocated memory 
for(int i = 0 ; i < ROWS ; i++) { 
    delete [] dynamicArray[i]; 
} 
delete [] dynamicArray; 
+2

यह सरणी की एक सरणी है, वास्तव में 2 डी एक नहीं है। –

+3

@ एलेक्सेंडर रैफर्टी: मुझे लगता है - "सरणी की सरणी" और "2 डी सरणी" के बीच क्या अंतर है? – Arun

+5

@ अरुणसाहा, यह पुराना है, लेकिन आपके प्रश्न का उत्तर देने के लिए और किसी और के लिए जो इस पर ठोकर खा रहा है, 2- डी सरणी स्मृति में संगत है; गतिशील सरणी की एक गतिशील सरणी पहले आयाम में संगत है, लेकिन दूसरे आयाम में प्रत्येक सरणी को अलग से संग्रहीत किया जाता है –

33
const int someheight = 3; 
const int somewidth = 5; 

int (*array)[somewidth] = new int[someheight][somewidth]; 
+6

यहां अन्य उत्तरों के विपरीत, यह वास्तव में प्रश्न का उत्तर देता है, जो कि एक बहुआयामी सरणी के लिए सूचक घोषित करने का तरीका था - एक जंजीर सरणी नहीं। प्रदर्शन-संवेदनशील अनुप्रयोगों के लिए यह एक महत्वपूर्ण भिन्नता है। यह काम करता है अगर "somewidth" स्थिर है, और केवल "कुछ" परिवर्तन। यदि आप देखते हैं कि यह 2 डी सरणी स्मृति में कैसे रखी गई है - यह सब एक साथ और संगत है, जिसमें एकल "नई" स्मृति आवंटन से अधिक नहीं है। अगर चौड़ाई भी गतिशील है तो अलेक्जेंडर रैफर्टी द्वारा इसका जवाब भी अच्छा है। अन्य उत्तरों धीमे हैं क्योंकि वे mallocs का एक टन करते हैं ... –

4

मैं की एक सरणी की तुलना में कहीं सरल तरीका उपयोग करने का सुझाव सरणी:

#define WIDTH 3 
#define HEIGHT 4 

int* array = new int[WIDTH*HEIGHT]; 
int x=1, y=2, cell; 
cell = array[x+WIDTH*y]; 

मुझे लगता है कि यह एक सरणी की सरणी से बेहतर दृष्टिकोण है, क्योंकि एफए है आर कम आवंटन। तुम भी एक सहायक मैक्रो लिख सकते हैं:

#define INDEX(x,y) ((x)+(WIDTH*(y))) 

int cell = array[INDEX(2,3)]; 
1

मुझे लगता है कि इस

int r, c ; 
std::cin>>r>>c ; 
int *array = new int[r*c] ; 

आप इनपुट इस

for (int i = 0 ; i < r ; i++){ 
    for (int j = 0 ; j < c ; j++){ 
     std::cin>>array[i *c + j] ; 
    } 
} 
2

व्यक्तिगत रूप से की तरह कुछ करने से मूल्यों, मेरी प्राथमिकता है सकते हैं क्या करेंगे गतिशील रूप से आकार वाले बहु-आयामी सरणी के लिए एक सूचक घोषित करने के लिए एक वाक्य रचनात्मक चाल का उपयोग करें। यह उन कंपाइलरों में काम करता है जो वेरिएबल लम्बाई सरणी (वीएलए) का समर्थन करते हैं, जो सभी सी ++ कंपाइलर्स, और सबसे वर्तमान सी कंपाइलर्स चाहिए।

मूल विचार यह में कब्जा कर लिया है: अंतरिक्ष के (सन्निहित) ब्लॉक में

void bar (int *p, int nz, int ny, int nx) { 
    int (*A)[ny][nx] = (int(*)[ny][nx]) p; 

"पी" अंक आप एक बहु-आयामी सरणी के रूप में इलाज के लिए चाहते हैं। "ए" के पास "पी" के समान मूल्य है, लेकिन घोषणा आपके द्वारा इच्छित बहु-आयामी तरीके से "ए" के संकलक के संदर्भ संदर्भ बनाती है। उदाहरण के लिए:

#include <iostream> 
using namespace std; 

void bar (int *p, int nz, int ny, int nx) 
{ 
    int (*A)[ny][nx] = (int(*)[ny][nx]) p; 

    for (int ii = 0; ii < nz; ii++) { 
    for (int jj = 0; jj < ny; jj++) { 
     for(int kk = 0; kk < nx; kk++) { 
      A[ii][jj][kk] = ii*1000000 + jj*1000 + kk; 
     } 
    } 
    } 
} 


void out (int *p, int nz, int ny, int nx) 
{ 
    int (*A)[ny][nx] = (int(*)[ny][nx]) p; 
    cout << A[11][22][33] << endl; 
} 


int main (void) 
{ 
    int NX = 97; 
    int NY = 92; 
    int NZ = 20; 
    int *space = new int [NZ * NY * NX]; 

    bar (space, NZ, NY, NX); 
    out (space, NZ, NY, NX); 
    return 0; 
} 

चल रहा है इस उत्पादन "11,022,033"

'ए' उर्फ ​​की घोषणा एक छोटे से अजीब लग रही है पैदा करता है, लेकिन यह आप सीधे और बस इच्छित बहु का उपयोग करने की अनुमति देता है आयामी सरणी वाक्यविन्यास

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