2011-06-16 9 views
10

Tengo un código que requiere el uso de un bucle for para leer las variables de una matriz.Obtener el tamaño de una matriz

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; 
    } 

} 

he estado teniendo algunos problemas porque cada vez que esta función se llama desde el programa, es casi como si los 'nombres' sizeof es incorrecto, por lo tanto, no se comprueban todos los valores de la matriz. Soy generalmente un programador de Java, así que estoy acostumbrado a names.length, y me dijeron que el tamaño de los nombres es esencialmente lo mismo ... ¿Alguna ayuda?

Saludos.

+1

¿No sería mejor utilizar NSDictionary en lugar de dos matrices que contienen el nombre de usuario y la contraseña correspondiente? – saad

+0

Usted no tiene un 'descanso'. Eso significa que si tiene otros nombres después de un nombre válido, entonces el ciclo continuará ejecutándose y afectará los valores de 'userValid' y' userPass'. Y su nombre no es intuitivo, tiene 'namesArray' que contiene una cadena, etc., lo que hace que su código sea más difícil de leer. – Abizern

+3

... y, por supuesto, ** no está almacenando las contraseñas como texto sin formato **. ¿derecho? ¿¡¿DERECHO?!? – bbum

Respuesta

28

No utilice sizeof. Use [names count].

+0

¡Muchas gracias! – gunmania0

3

Desea utilizar [nombres] no tamaño de nombres. Sizeof le dará el tamaño del puntero real del objeto en sí y no la cantidad de elementos, ya que es un tipo de memoria dinámica.

0

Para obtener la cantidad de elementos almacenados en un NSAarray, debe usar el método de instancia count, que devuelve NSUInteger.

Alternatevely, puede iterar sobre estos elementos utilizando el bucle for in, que también está disponible en Java, si no recuerdo mal.

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

Tenga en cuenta que sizeof es un operador de C que devuelve el tamaño en bytes de su operando, por lo que no te dice cuántos elementos se almacenan en que NSArray, pero el tamaño en bytes de un caso NSArray.

+1

el problema con este método es que no obtiene un índice. Y, dado que tiene la contraseña en una matriz diferente, sin un índice no puede emparejarlos. Si estaba usando un diccionario, podría usar la enumeración rápida. – Abizern

0

Sé que su pregunta ya ha sido contestada - pero aquí es una más cacao forma de escribir que

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

También se puede utilizar la enumeración rápida, en algunos casos puede ser más claro para el lector :

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; 
} 
Cuestiones relacionadas