2011-06-16 13 views
10

मेरे पास कुछ कोड है जिसके लिए एक सरणी से चर पढ़ने के लिए लूप के उपयोग की आवश्यकता होती है।एक सरणी का आकार प्राप्त करना

int size=sizeof names; 
NSLog(@"thelast one is %d",size); 
NSString *usersName=userName.text; 
NSString *usersPass=passWord.text; 
for (i=0; i<=size;i++){ 

    NSString *namesArray=[names objectAtIndex:i]; 
    NSString *passArray=[pass objectAtIndex:i]; 
    NSLog(@"namesArray %@",namesArray); 
    NSLog(@"passArray %@",passArray); 
    if([namesArray isEqualToString:usersName]){ 
     userValid=1; 
    NSLog(@"The content of arry4 is %@",namesArray); 


    } 
    if([passArray isEqualToString:usersPass]){ 
     passValid=1; 
     NSLog(@"The content of arry4 is %@",passArray); 
    } 

    else { 
     userValid=0; 
     passValid=0; 
    } 

} 

मैं कुछ समस्या हो रही किया गया है हर बार इस समारोह कार्यक्रम के भीतर से कहा जाता है, यह लगभग है, क्योंकि के रूप में अगर 'sizeof नाम' गलत है, इसलिए नहीं सरणी में सभी मान जाँच कर रहे हैं। मैं आम तौर पर एक जावा प्रोग्रामर हूं इसलिए मुझे नामों के लिए उपयोग किया जाता है। लम्बाई, और मुझे बताया गया कि आकार का नाम अनिवार्य रूप से वही बात है ... कोई मदद?

चीयर्स।

+1

क्या उपयोगकर्ता नाम और संबंधित पासवर्ड रखने वाले दो सरणी के बजाय NSDictionary का उपयोग करना बेहतर नहीं होगा? – saad

+0

आपके पास 'ब्रेक' नहीं है। इसका अर्थ यह है कि यदि आपके पास वैध नाम के बाद कोई अन्य नाम है तो लूप जारी रहेगा और 'userValid' और' userPass' के मानों को रोक देगा। और, आपका नामकरण सहज नहीं है - आपके पास 'नामअरे' है जिसमें एक स्ट्रिंग, आदि शामिल है - जो आपके कोड को पढ़ने में कठोर बनाता है। – Abizern

+3

... और, ज़ाहिर है, आप ** सादा पाठ ** के रूप में पासवर्ड संग्रहीत नहीं कर रहे हैं। सही? सही?!? – bbum

उत्तर

28

आकार का उपयोग न करें। [names count] का प्रयोग करें।

+0

बहुत बहुत धन्यवाद! – gunmania0

3

आप नामों का नाम नहीं [नाम गणना] का उपयोग करना चाहते हैं। आकार आपको वास्तविक नाम ऑब्जेक्ट पॉइंटर का आकार देने जा रहा है, न कि तत्वों की संख्या, क्योंकि यह गतिशील स्मृति प्रकार है।

0

NSAarray में संग्रहीत तत्वों की संख्या प्राप्त करने के लिए आपको उदाहरण विधि count का उपयोग करना चाहिए, जो NSUInteger देता है।

वैकल्पिक रूप से, आप for in लूप का उपयोग करके इन तत्वों पर पुन: सक्रिय कर सकते हैं, जो जावा में भी उपलब्ध है, अगर मुझे सही याद है।

for (MyClass *element in myArray) { 
    NSLog(@"%@", element); 
} 

ध्यान दें कि sizeof एक सी ऑपरेटर कि अपनी संकार्य के बाइट्स में आकार देता है, तो यह आपको बता नहीं है कि कितने तत्वों कि NSArray में जमा हो जाती है, लेकिन एक NSArray उदाहरण के बाइट्स में आकार।

+1

इस विधि के साथ समस्या, यह है कि आपको एक सूचकांक नहीं मिलता है। और, चूंकि उसके पास एक अलग सरणी में पासवर्ड है, बिना किसी इंडेक्स के वह उन्हें मेल नहीं कर सकता है। यदि वह एक शब्दकोश का उपयोग कर रहा था, तो वह तेजी से गणना का उपयोग कर सकता था। – Abizern

0

मैं जानता हूँ कि अपने प्रश्न पहले से ही उत्तर दिया गया है - लेकिन यहाँ एक और अधिक कोको लेखन का तरीका है यह

NSString *userName = userName.text; 
NSString *userPass = passWord.text; 

// Use a block enumerator 
NSUInteger nameIdx = [names indexOfObjectPassingTest:^(id obj, NSUInteger idx, BOOL *stop) { 
    return ([obj isEqualToString:userName]); 
}]; 

// Is the name in the array 
if (nameIdx == NSNotFound) { 
    // Name not in array - so set to zero 
    userValid = 0; 
    passValid = 0; 
} else { 
    userValid = 1; 
    // See if the corresponding password is correct 
    NSString password = [pass objectAtIndex:nameIdx]; 
    if (![password isEqualToString:userPass]) { 
     passValid = 0; 
    } else { 
     passValid = 1; 
} 
0

एक भी तेजी से गणन उपयोग कर सकते हैं, कुछ मामलों में यह एक पाठक को और अधिक स्पष्ट हो सकता है :

NSString *userName = userName.text; 
NSString *userPass = passWord.text; 

BOOL userValid = NO; 
BOOL passValid = NO; 
int index = 0; 
for (NSString *eachName in namesArray) { 
    if ([eachName isEqualToString:userName) { 
     userValid = YES: 
     if ([[passArray objextAtIndex:index] isEqualToString:passWord) { 
      passValid = YES; 
     } 
     break; 
    } 
    index += 1; 
} 
संबंधित मुद्दे