2011-02-12 15 views
5

मैं एनएससीओडी का समर्थन करने वाली कक्षा को क्रमबद्ध करने पर काम कर रहा हूं। मैंने encodeWithCoder और initWithCoder सेटअप किया है, और सभी मानक उद्देश्य सी डेटा प्रकार ठीक काम करते हैं।इंक की एक सी शैली सरणी एन्कोडिंग

मैं जो कुछ संघर्ष कर रहा हूं वह है कि कुछ सरल सी सरणी कैसे एन्कोड करें। उदाहरण के लिए:

उन्हें तोड़ने और एन्कोडिंग की
int bonusGrid[5]; 
int scoreGrid[10][10]; 
int solutionGrid[10][10]; 
int tileGrid[10][10]; 

कम हर एक-एक करके int, मैं उनसे निपटने के लिए कैसे यकीन नहीं है। सी सरणी को संभालने के लिए एक "मानक" तरीका है?

धन्यवाद!

+1

क्या आप अन्य कंप्यूटरों पर डेटा का उपयोग कर रहे हैं? क्या एंडियन मुद्दे होंगे? – jswolf19

+0

केवल आईफोन और आईपैड। शायद मैक किसी दिन, लेकिन यह निश्चित नहीं है। – Axeva

उत्तर

7

एरे लपेटने के लिए एनएसडीटा का उपयोग करने का एक तरीका होगा।

- (void)encodeWithCoder:(NSCoder *)coder { 
    [coder encodeObject:[NSData dataWithBytes:(void*)bonusGrid length:5*sizeof(int)] forKey:@"bonusGrid"]; 
    [coder encodeObject:[NSData dataWithBytes:(void*)scoreGrid length:10*10*sizeof(int)] forKey:@"scoreGrid"]; 
    ... 
} 

- (id)initWithCoder:(NSCoder *)coder 
    if((self = [super initWithCoder:coder])) { 
     NSData *data = [coder objectForKey:@"bonusGrid"]; 
     int *temporary = (int*)[data bytes]; 
     for(unsigned char i = 0; i < 5; ++i) bonusGrid[i] = temporary[i]; 
     data = [coder objectForKey:@"scoreGrid"]; 
     temporary = (int*)[data bytes]; 
     for(unsigned char i = 0; i < 10; ++i) 
      for(unsigned char j = 0; j < 10; ++j) 
       scoreGrid[i][j] = temporary[i*10 + j]; 
     ... 
    } 
    return self; 
} 

तुम भी memcpy() इस्तेमाल कर सकते हैं डेटा अपने विन्यास में वापस ले जाने के, लेकिन यह उचित नहीं है और सभी प्रणालियों (यह iPhone और मैक पर काम करता है) पर काम करने की गारंटी नहीं है।

+0

उत्तर के लिए धन्यवाद। मैं उत्सुक हूं कि आप केवल बोनसग्रिड का उपयोग करने के बजाय बोनसग्रिड को पुनर्प्राप्त करते समय अस्थायी सरणी का उपयोग क्यों कर रहे हैं? – Axeva

+0

बोनसग्रिड एक सरणी है, लेकिन बाइट विधि एक पॉइंटर लौटाती है (जिसे एनएसडीटा ऑब्जेक्ट जारी होने पर मुक्त किया जाएगा)। किसी सरणी को पॉइंटर असाइन करने का प्रयास करना अवैध है और या तो चेतावनी या त्रुटि उत्पन्न होगी (मुझे याद नहीं है, लेकिन मुझे लगता है कि यह एक त्रुटि है)। आपको सूचक की सामग्री को सरणी के स्थान पर कॉपी करने की आवश्यकता है। – ughoavgfhw

+0

गोचा। आपका दृष्टिकोण वह दृष्टिकोण है जिसे मैं शायद ले जाऊंगा। शर्म की बात है इस बारे में जाने का कोई आसान तरीका नहीं है। ऐप्पल देशी सी प्रकारों को संभालने का एक तरीका प्रदान करता है, लेकिन उन प्रकार के सरणी नहीं? यह मेरी किताब में एक निरीक्षण है। – Axeva

0

this प्रश्न का उत्तर देखें। यह विवरण देता है कि सी सरणी को NSArray ऑब्जेक्ट में कनवर्ट करने के लिए आपको क्या करना होगा।

+0

मैंने इस दृष्टिकोण के बारे में सोचा। ऐसा लगता है कि यह समय गहन हो सकता है। हम डेटा के एक टन के बारे में बात नहीं कर रहे हैं, लेकिन प्रत्येक मूल्य के माध्यम से लूपिंग करते हैं, एनएसएनंबर बनाते हैं, इसे एनएसएमयूटेबलएरे में जोड़ते हैं - ऐसा लगता है कि यह बहुत काम करता है। – Axeva

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