2009-06-18 14 views
18

हम एनएसएआरएआर को सी सरणी में परिवर्तित कर सकते हैं। । यदि क्या नहीं विकल्प देखते हैं [लगता है मैं ओपन कार्यों में ग सरणी जहां ग सरणी शिखर सूचक plist फ़ाइलों से पढ़ने शामिल खिलाने के लिए की जरूरत है]एनएसएआरएआर से सी सर

उत्तर

37

उत्तर सी-सरणी की प्रकृति पर निर्भर करता है।

आप आदिम मूल्यों की और ज्ञात लंबाई की एक सरणी को भरने के लिए की जरूरत है, तो आप कुछ इस तरह कर सकता है:

NSArray* nsArray = [NSArray arrayWithObjects:[NSNumber numberWithInt:1], 
              [NSNumber numberWithInt:2], 
              nil]; 
int cArray[2]; 

// Fill C-array with ints 
int count = [nsArray count]; 

for (int i = 0; i < count; ++i) { 
    cArray[i] = [[nsArray objectAtIndex:i] intValue]; 
} 

// Do stuff with the C-array 
NSLog(@"%d %d", cArray[0], cArray[1]); 

यहाँ एक उदाहरण है, जहां हम एक NSArray से एक नई सी-सरणी का निर्माण करना चाहते है, Obj सी वस्तुओं के रूप में सरणी आइटम रखने:

NSArray* nsArray = [NSArray arrayWithObjects:@"First", @"Second", nil]; 

// Make a C-array 
int count = [nsArray count]; 
NSString** cArray = malloc(sizeof(NSString*) * count); 

for (int i = 0; i < count; ++i) { 
    cArray[i] = [nsArray objectAtIndex:i]; 
    [cArray[i] retain]; // C-arrays don't automatically retain contents 
} 

// Do stuff with the C-array 
for (int i = 0; i < count; ++i) { 
    NSLog(cArray[i]); 
} 

// Free the C-array's memory 
for (int i = 0; i < count; ++i) { 
    [cArray[i] release]; 
} 
free(cArray); 

या, आप nil करना चाह सकते हैं -terminate सरणी के बजाय इसकी लंबाई के आसपास गुजर:

// Make a nil-terminated C-array 
int count = [nsArray count]; 
NSString** cArray = malloc(sizeof(NSString*) * (count + 1)); 

for (int i = 0; i < count; ++i) { 
    cArray[i] = [nsArray objectAtIndex:i]; 
    [cArray[i] retain]; // C-arrays don't automatically retain contents 
} 

cArray[count] = nil; 

// Do stuff with the C-array 
for (NSString** item = cArray; *item; ++item) { 
    NSLog(*item); 
} 

// Free the C-array's memory 
for (NSString** item = cArray; *item; ++item) { 
    [*item release]; 
} 
free(cArray); 
+2

यह एक महान जवाब है, काश मैं ऊपर एक से अधिक बार मतदान कर सकता है। मेरे पास एक सुझाव है जो कि 'एनएसएसटींग **' प्रकार का उपयोग थोड़ा खराब है। मैं सुझाव देता हूं कि '[NSData initWithBytesNoCopy: length: freeWhenDone:]' के साथ सूचक जो malloc देता है, और सरणी का आकार। – alfwatt

+0

मैंने मैलोक का उपयोग करने वाले दूसरे दृष्टिकोण की कोशिश की, मुझे लगता है कि इसे अक्षम होने की आवश्यकता है। कम से कम, इस तरह मैं इसे काम करने के लिए मिला। शायद इस सवाल से पूछा गया था कि इस सवाल से पूछा गया था .... –

4

मैं, अपने आप को परिवर्तित करने के लिए की तरह कुछ के साथ सुझाव है:

NSArray * myArray; 

... // code feeding myArray 

id table[ [myArray count] ]; 

int i = 0; 
for (id item in myArray) 
{ 
    table[i++] = item; 
} 
6

NSArray में एक सरणी के उप-श्रेणी के लिए सी-सरणी बनाने के लिए -getObjects:range: विधि है।

उदाहरण:

NSArray *someArray = /* .... */; 
NSRange copyRange = NSMakeRange(0, [someArray count]); 
id *cArray = malloc(sizeof(id *) * copyRange.length); 

[someArray getObjects:cArray range:copyRange]; 

/* use cArray somewhere */ 

free(cArray); 
+0

जो NSNumber ऑब्जेक्ट्स को एक आदित्मक संख्यात्मक प्रकार में परिवर्तित नहीं करेगा, हालांकि। प्रश्नकर्ता को ओपनजीएल के साथ सी सरणी का उपयोग करने के लिए रूपांतरण की आवश्यकता होती है; इसके कारण, वे सीएस सरणी को पूरी तरह से स्वयं भी बना सकते हैं, बिना किसी NSNumbers को डाले। –

+0

आह! समस्या के लिए ओपनजीएल आवश्यकता नहीं देखी गई। उस स्थिति में हाँ, सरणी को मैन्युअल रूप से पुन: सक्रिय करना उपयुक्त होगा। –

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