2009-06-30 12 views
5

Quiero saber cómo pasar estructuras a otra función y posteriormente acceder a esa estructura en la función llamada. Estoy desarrollando para el iPhone y la razón por la que estoy usando estructuras es por lo que con el tiempo puede pasar datos como estructuras a un servidor que se construyen en C.Pasar y acceder a las estructuras con el objetivo-c

Aquí está la estructura:

struct userInfo{ 
    NSString *firstName; 
    NSString *lastName; 
    NSString *username; 
    NSString *email; 
    NSString *ipAddress; 
    double latitude; 
    double longitude; 
}; 

Aquí 'm simplemente ir a buscar algunos datos inputed usuario junto con algunos datos CoreLocation y la dirección IP del iPhone:

- (IBAction)joinButton { 
    struct userInfo localUser; 

    localUser.firstName = firstName.text; 
    localUser.lastName = lastName.text; 
    localUser.username = username.text; 
    localUser.email = emailAddress.text; 
    localUser.ipAddress = localIPAddress.text; 
    localUser.latitude = currentLocation.coordinate.latitude; 
    localUser.longitude = currentLocation.coordinate.longitude; 

    [myNetworkConnection registerWithServer:&localUser]; 
} 

función de manejo de la estructura:

- (void)registerWithServer:(struct userInfo*)myUser { 

    printf("First name is: %s", myUser.firstName);//error when compiling 
} 

el compilador arroja este error: request for member 'firstName' in something not a structure or union. ¿Está esa estructura fuera del alcance cuando intento acceder a ella en la segunda función?

+0

No hay ninguna razón para colocar objetos Objective-C dentro de las estructuras. No lo hagas O crea un objeto para guardar tus datos, colócalo en un NSDictionary o conviértalo todo en C nativo, como por ejemplo char * para tu estructura. –

Respuesta

7

Está pasando un puntero a una estructura. Use el operador ->, no el punto.

myUser->firstName 
+0

que emite 8a en la consola, que no es la cadena invocada. –

+0

Eso es porque es un NSString, no una cadena C (char *). Puede obtener una cadena en C con una copia del contenido del NSString utilizando los métodos cStringUsingEncoding :, getCString: maxLength: encoding: o UTF8String. El último puede ser el más fácil: printf ("% s \ n", [myUser-> firstName UTF8String]); – mkb

+0

Para generar un NSString con printf(), debe convertirlo en un char * y usar el especificador de formato% s. Sin embargo, puede usar% @ con NSLog o con su propia variante. http://cocoaheads.byu.edu/wiki/a-different-nslog –

2

no puedo evitar pensar que realmente debería hacer que un objeto Objective-C adecuado con propiedades - más trabajo pero entonces estarán todos se comportan mejor y vivan dentro del ecosistema NSObject.

+0

correcto, y probablemente llegue a eso. pero ahora quiero sentirme cómodo enviando una estructura desde el iPhone a un servidor remoto. Me imagino que en el futuro esto será un objeto y copiaré sus propiedades en una estructura para expulsar. –

+0

En lugar de escribir un servidor C personalizado que separa una estructura binaria construida en una arquitectura completamente diferente del código del servidor, en su lugar considere construir un servicio web estilo REST simple donde pase datos nuevos como parámetros en su lugar ... esto hará la vida es mucho más fácil para ti en el largo plazo. De lo contrario, comience a leer sobre problemas endian y cómo adaptarse para diferentes tamaños int en estructuras ... –

Cuestiones relacionadas