2009-09-09 6 views
7

में एक समारोह पैरामीटर के रूप में चर लंबाई के एक पूर्णांक सरणी पासिंग मैं निम्नलिखित कोड है जो ठीक काम करता है ...उद्देश्य सी

int testarr[3][3] = { 
    {1,1,1}, 
    {1,0,1}, 
    {1,1,1} 
}; 
[self testCall: testarr]; 

इस फ़ंक्शन को कॉल कौन सा:

- (void)testCall: (int[3][3]) arr { 

    NSLog(@"cell value is %u",arr[1][1]); 
} 

मैं की जरूरत है सरणी परिवर्तनीय लंबाई होने के लिए - समारोह घोषित करने का सबसे अच्छा तरीका क्या है?

का उपयोग कारतूस काम नहीं करता:

- (void)testCall: (int[][]) arr { 

आपकी मदद के लिए धन्यवाद।

उत्तर

6

मैं इस बारे में के रूप में:

- (void) testCall: (int *) aMatrice; 

ऐसा करने से आपको से बचने के लिए अनुमति देता है एकाधिक mallocs और गणित एक्स पर आधारित एक रैखिक सरणी में एक ऑफसेट की गणना करने के लिए, 2 डी सरणी में y coordinates छोटे है। यह int ** द्वारा निहित एकाधिक मॉलॉक्स और भाषा द्वारा बनाए गए 2 डी सरणी वाक्यविन्यास की सीमाओं से भी बचाता है।

इसलिए, यदि आप एक 4x5 सरणी चाहते हैं तो आप क्या कर सकते हैं:

#define WIDTH 4 
#define HEIGHT 5 
#define INDEXOF(x,y) ((y*WIDTH) + x) 

int *myArray = malloc(sizeof(int) * 5 * ELEMS_PER_ROW); 

फिर आप रैखिक या पाश के लिए एक नेस्टेड के साथ सरणी को प्रारंभ कर सकते हैं:

for(int x=0; x<width; x++) 
    for(int y=0; y<height; y++) 
     myArray[INDEXOF(x,y)] = ... some value ...; 

और आप इसे से होकर गुजरेगा विधि के लिए:

[foo testCall: myArray]; 

हालांकि आप चौड़ाई और ऊंचाई या bette के साथ भी ले जाना चाहते हैं आर अभी तक, एनएसओब्जेक्ट का इंटमैट्रिक्स सबक्लास बनाएं जो एक अच्छी साफ एपीआई से परे सभी पॉइंटर अंकगणित और भंडारण को लपेटता है।

(सभी कोड अतः में टाइप)

+0

यह हल करने के लिए यह एक बहुत ही चालाक तरीका था - धन्यवाद। –

+1

'[foo testCall: myArray]' कॉल करने के बाद 'मुक्त()' स्मृति को न भूलें; –

1

आप NSArray या NSMutableArray का उपयोग NSInteger एस के साथ क्यों नहीं करते? वे सरणी वर्ग परिवर्तनीय लंबाई के हैं, और उपयोग करने के लिए बहुत आसान है।

यह

- (void)testCall: (NSArray *) arr { 
    NSLog(@"cell value is %u", [[arr objectAtIndex:1] objectAtIndex:1]); 
} 

में परिणाम होगा (बेशक, आप भी NSArray का उपयोग कर testarr को परिभाषित करना होगा।)



आप वास्तव में सी सरणियों उपयोग करना चाहते हैं, जिससे विधि तर्क

- (void)testCall: (int*) arr {

के साथ एक int के लिए एक सूचक 10

शायद काम करेगा (शेष कोड के साथ ही रहेंगे)।

+2

ओ पी का उपयोग करने की आवश्यकता होगी '(int **)' एक दो आयामी सरणी मिलता है। –

+0

आप NSIntegers को एनएसएआरएआरई में नहीं डाल सकते हैं क्योंकि एनएसआईएनटेगर एक ऑब्जेक्ट नहीं है, यह किसी प्रकार का int टाइप है। आपको NSNumber का उपयोग करना होगा, जो कुछ ओवरहेड पेश करेगा। – Amok

+0

क्रिस, (int **) का अर्थ है एक सूचक को एक सूचक के लिए एक सूचक, एक दो आयामी सरणी के सूचक नहीं। एक संकेत जोड़ने से आपके द्वारा संदर्भित स्मृति के लेआउट के साथ कुछ लेना देना नहीं है। – NSResponder

2

आप int[][] का उपयोग नहीं कर सकते हैं क्योंकि दूसरे आयाम का आकार स्मृति में सरणी को कैसे रखता है इस पर प्रभाव डालता है। यदि आप दूसरे आयाम को जानते हैं तो आप int[][x] का उपयोग कर सकते हैं, अन्यथा आपको int** का उपयोग करना होगा जिसे किसी सरणी की तरह एक्सेस किया जा सकता है।

3

सी एरे एक से अधिक आयाम में चर नहीं हो सकते हैं।

आप इस के लिए नहीं कर सकते हैं:

int testarr[][] = { 
    {1,1,1}, 
    {1,0,1,2}, 
    {1,1} 
}; 

लेकिन आप यह कर सकते हैं:

int testarr[][3] = { 
    {1,1,1}, 
    {1,0,1}, 
    {1,1,1}, 
    {4,5,6}, 
    {7,8,9} 
} 

foo(testarr); 

void foo(int param[][3]) 
{ 
    printf("%d", param[3][1]); // prints 5 
} 
0

कॉल

int testarr[3][3] = { 
    {1,1,1}, 
    {1,0,1}, 
    {1,1,1} 
}; 
[self testCall: (int *)testarr]; 

समारोह

- (void)testCall: (int *) arr 
{ 
    int (*V_arr)[3] = (int(*)[3])arr; 
    NSLog(@"cell value is %u",V_arr[1][1]); 
}