Iphone 使用objective-c的通道和访问结构

Iphone 使用objective-c的通道和访问结构,iphone,c,objective-c,struct,argument-passing,Iphone,C,Objective C,Struct,Argument Passing,我想知道如何将结构传递给另一个函数,然后在被调用的函数中访问该结构。我是为iPhone开发的,使用structs的原因是,我最终可以将数据作为structs传递给用C语言构建的服务器 结构如下: struct userInfo{ NSString *firstName; NSString *lastName; NSString *username; NSString *email; NSString *ipAddress; double latit

我想知道如何将结构传递给另一个函数,然后在被调用的函数中访问该结构。我是为iPhone开发的,使用structs的原因是,我最终可以将数据作为structs传递给用C语言构建的服务器

结构如下:

struct userInfo{
    NSString *firstName;
    NSString *lastName;
    NSString *username;
    NSString *email;
    NSString *ipAddress;
    double latitude;
    double longitude;
};
在这里,我只是获取一些用户输入的数据以及一些CoreLocation数据和iPhone的IP地址:

- (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];
}
处理结构的函数:

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

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

编译器抛出此错误:
请求非结构或联合中的成员“firstName”
。当我尝试在第二个函数中访问该结构时,该结构是否超出范围?

您正在传递指向该结构的指针。使用->操作符,而不是点

myUser->firstName

我忍不住想,你真的应该让它成为一个具有属性的适当的objective-C对象——需要做更多的工作,但这样它就会表现得更好,并生活在NSObject生态系统中。

在控制台上输出8a,这不是输入的字符串。这是因为它是NSString,而不是C字符串(char*)。您可以使用cStringUsingEncoding:、getCString:maxLength:encoding:、或UTF8String方法获取带有NSString内容副本的C字符串。最后一个可能是最简单的:printf(“%s\n”,[myUser->firstName UTF8String]);要使用printf()输出NSString,必须将其转换为char*并使用%s格式说明符。但是,您可以将%@与NSLog一起使用,也可以与您自己的变体一起使用。谢谢我应该想出来的。由于这些结构最终将被传递到服务器,我现在想我应该使用char数组而不是nsstring来定义结构。在这种情况下,您可能希望确保结构在客户端和服务器上对齐到相同的宽度。没有理由将Objective-C对象放在结构中。不要这样做。要么创建一个对象来保存数据,将其放在NSDictionary中,要么将struct.right的所有内容都转换为本机C类型,如char*,它可能会达到这个目的。但现在,我想让从iPhone向远程服务器发送struct变得轻松。我设想在未来这将是一个对象,我将把它的属性复制到一个结构中以推出。而不是编写一个定制的C服务器,将构建在与服务器代码完全不同的体系结构上的二进制结构分离开来,相反,请考虑建立一个简单的REST风格的Web服务,在这里,您将新数据作为参数传递给…从长远来看,这会让你的生活变得越来越轻松。否则,请开始阅读endian问题以及如何适应结构中不同的整数大小。。。