2009-05-26 18 views
7

में int [] सरणी घोषित करना, गुण, संश्लेषण, और कार्यान्वयन करना उद्देश्य सी में आकार 5 की एक int सरणी को कैसे घोषित करें, गुणों को संश्लेषित करें, और कार्यान्वित करें? मैं एक आईफोन ऐप के लिए यह कोड लिख रहा हूं। धन्यवाद।उद्देश्य सी

+1

यदि आप इस चरण को पार नहीं कर पा रहे हैं, तो मैं दिल से अनुशंसा करता हूं कि आपको वास्तव में कोको प्रोग्रामिंग पर हारून हिलेगैस की पुस्तक मिलनी चाहिए। – KevinDTimm

+0

बात यह है कि मुझे पता है कि मैं एनएसएमयूटेबलएरे का उपयोग करने से दूर हो सकता हूं या आकार 5 के ठीक होने के बाद से केवल 5 अलग-अलग चींटियां हो सकती हैं, लेकिन इनट्स की एक सरणी बहुत अधिक सुरुचिपूर्ण होगी। मैं यह भी जानना चाहूंगा कि भविष्य के लिए कैसे। मैंने कई अन्य भाषाओं में लिखा है, लेकिन मुझे लगता है कि आईफोन के लिए उद्देश्य सी में इसे कैसे किया जाए, इसके लिए मुझे एक निश्चित उत्तर नहीं मिल रहा है। –

उत्तर

9

मुझे लगता है कि "कोको-y" ऐसा करने के लिए बात पूर्णांक सरणी भले ही आप इसे आंतरिक रूप से उपयोग करने को छिपाने के लिए है। कुछ की तरह:

@interface Lottery : NSObject { 
    int numbers[5]; 
} 

- (int)numberAtIndex:(int)index; 
- (void)setNumber:(int)number atIndex:(int)index; 
@end 

@implementation Lottery 

- (int)numberAtIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    return numbers[index]; 
} 

- (void)setNumber:(int)number atIndex:(int)index { 
    if (index > 4) 
     [[NSException exceptionWithName:NSRangeException reason:[NSString stringWithFormat:@"Index %d is out of range", index] userInfo:nil] raise]; 
    numbers[index] = number; 
} 
+0

यह अधिक है। एक सी सरणी का प्रयोग करें। –

+0

मैं यह कैसे करूँगा? मुझे लगता है कि मूल रूप से int सरणी के साथ मेरा मतलब है। –

+0

वह * एक सी सरणी, रोजर का उपयोग कर रहा है। लेकिन यह memcpy और निम्न-स्तरीय विवरणों की सभी परेशानी को हटा देता है जो वास्तव में कोको इंटरफेस में नहीं हैं। – Chuck

0

यदि आप किसी सरणी का उपयोग करना चाहते हैं तो आपको इस मामले में int का उपयोग नहीं करना चाहिए। NSNumber का उपयोग करें और उन 5 NSNumbers को NSMutableArray में रखें।

@interface testClass: NSObject { 
    NSMutableArray* numbers; 
} 
@property (nonatomic, retain) NSMutableArray* numbers; 
-(id)initWithValue:(NSNumber *)initialValue; 
@end 


@implementation testClass 
@synthesize numbers; 
-(id)initWithValue:(NSNumber *)initialValue { 
    numbers = [[NSMutableArray alloc] initWithCapacity:5]; 
    [numbers addObject:initialValue]; 
    return self; 
} 
@end 

संश्लेषण के साथ इंटरफ़ेस और कार्यान्वयन के लिए कोड (परीक्षण बीटीडब्लू नहीं) है। आप क्या खत्म करने की कोशिश कर रहे हैं?

Good quick intro

+0

त्वरित प्रतिक्रिया के लिए धन्यवाद। कारण मैं इनट्स की एक सरणी का उपयोग करना चाहता था, यह है कि मैं 1: 1000 के बीच 5 यादृच्छिक/अद्वितीय संख्याओं को स्टोर करने की कोशिश कर रहा हूं और मैं यह जांचने के लिए एक आसान संरचना चाहता था कि प्रत्येक अनुवर्ती int अद्वितीय है या नहीं। ऐसा लगता है कि एनएसएमयूटेबलएरे का उपयोग करके यह और अधिक कठिन होगा। आपकी क्या सलाह है? –

+0

अहह, तो शायद एक लूप में आप जांच सकते हैं कि intArray [i] == intArray [i-1] तो विफल हो गया है? ओबीजेसी वस्तुओं का उपयोग करके यह निश्चित रूप से अधिक ऊपरी है, यह int [] का उपयोग करना बेहतर हो सकता है। क्या आप संख्या उत्पन्न कर रहे तरीके में एक पूर्ण चर के रूप में पूर्णांक सरणी रख सकते हैं? या क्या आपको कक्षा की एक सुलभ संपत्ति होने की आवश्यकता है? – ryanday

+0

मैं चाहता हूं कि यह एक आवृत्ति चर हो क्योंकि वर्ग एमवीसी में मॉडल का हिस्सा है। हालांकि, अगर आकार केवल 5 है तो अतिरिक्त ओवरहेड महत्वपूर्ण होगा? –

0

मैं एक वर्ग चर है:

NSInteger myInt[5]; 

तो है कि मैं अपने कोड में सामान्य मींट [1] = 0 सिंटैक्स का उपयोग कर सकता है, मैं एक संपत्ति है कि एक पूर्णांक सूचक रिटर्न बनाया :

-(NSInteger *) myInt { 
    return myInt 
} 
0123:

@property (nonatomic, readonly) NSInteger *myInt; 

तो निम्नलिखित गेटर विधि बनाया

अब मैं class.myInt [1] = 0 जैसे कुछ का उपयोग कर सकता हूं;

ठीक है, मुझे यकीन है कि यह काम करता है, लेकिन ऐसा लगता है। मैंने सोचा कि अगर मैं इसे और कोशिश करना चाहता हूं तो मैं इसे बाहर रखूंगा।

2

यहां कुछ प्रयास करने का प्रयास किया गया है। ज फ़ाइल में:

@property int* myIntArray; 

फिर, .m फ़ाइल में:

@synthesize myIntArray; 

आप @synthesize का उपयोग करते हैं, तो आप malloc के लिए/सरणी खुद calloc, शायद init दौरान की आवश्यकता होगी ()।

वैकल्पिक रूप से, आप अपने स्वयं के एक्सेसर फ़ंक्शंस लिख सकते हैं और उन्हें सरणी आवंटित करने से पहले कॉल किया गया है तो उन्हें malloc/calloc है।

किसी भी तरह से, आप सरणी को dealloc() विधि में मुक्त करना चाहते हैं।

यह शायद बेवकूफ़ और गलत है, क्योंकि मैं सिर्फ उद्देश्य सी पर चढ़ रहा हूं, लेकिन अब तक यह मेरे लिए काम कर रहा है।

+0

+1 ग्रेट पहला जवाब! – bakoyaro

0

जो भी आप करते हैं, आपको परिणामों के बारे में अवगत होना चाहिए।

एक पूर्णांक सरणी संदर्भित नहीं है। आप नहीं जानते कि कितने लोग इसका उपयोग कर रहे हैं। आप नहीं जानते कि इसे कब और कब हटाया जाना चाहिए। तो आप टाइप int * की संपत्ति आसानी से आसानी से कर सकते हैं। सेटर एक सूचक ले जाएगा और इसे आवृत्ति चर में स्टोर करेगा। गेटटर आवृत्ति चर की सामग्री वापस कर देगा। यह सिर्फ काम करता है।

हालांकि आपको पता नहीं है कि सरणी को आवंटित या अस्वीकार किया जाना चाहिए। यदि आपके पास कुछ स्थैतिक सरणी हैं (उदाहरण के लिए संख्याओं वाली चार अलग-अलग सारणीएं), कोई समस्या नहीं है।लेकिन यदि आप malloc() के साथ पूर्णांक की सरणी बनाते हैं, तो किसी को इसे मुक्त करना चाहिए()। तो यह कब होने जा रहा है?

क्योंकि मैन्युअल एक सरणी के जीवनकाल को संभालने के लिए हो रही बकवास है, मैं तुम्हें जो संदर्भ गिनती के साथ पूर्णांकों का दुकान सरणियों के साथ दुर्व्यवहार किया जा सकता है NSPointerArray को देखने की सलाह देते हैं कि आप या तो सिर्फ NSNumber का एक NSArray का उपयोग करें, या, या आप पिछले उत्तर में लॉटरी क्लास की तरह अपनी खुद की कक्षा बनाते हैं, बस थोड़ा और अधिक लचीला।