Objective c 在NSArray中存储结构

Objective c 在NSArray中存储结构,objective-c,c,struct,nsdata,wavefront,Objective C,C,Struct,Nsdata,Wavefront,回到我每天愚蠢的问题上来。今天我想把一个结构放在一个NSArray中。好的,很简单,用NSData包起来。如果你认识我,你就知道你即将看到密码。在本例中,我将一条顶点线从波前对象加载到一个结构中,并将其粘贴到一个数组中 NSArray *verticeLineParts = [currentLine componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; Coor

回到我每天愚蠢的问题上来。今天我想把一个结构放在一个NSArray中。好的,很简单,用NSData包起来。如果你认识我,你就知道你即将看到密码。在本例中,我将一条顶点线从波前对象加载到一个结构中,并将其粘贴到一个数组中

        NSArray *verticeLineParts = [currentLine componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
        Coordinate c = CoordinateMake([[verticeLineParts objectAtIndex:1] floatValue],
                                      [[verticeLineParts objectAtIndex:2] floatValue],
                                      [[verticeLineParts objectAtIndex:3] floatValue]);
        [vertices addObject:[[NSData alloc] initWithBytes:&c length:sizeof(c)]];
这似乎很有效。输出中的前几个对象:

2010-10-18 14:18:08.237 ObjLoader[3778:207] (
    <5d1613bd 13f3da3f 8ac745bd>,
    <f04c28bd 13f3da3f d88048bd>,
    <649427bd d61ddb3f d88048bd>,
    <477625bd d845db3f d88048bd>,
    <4c1722bd 1668db3f d88048bd>,
我认为这是由一个不是C巫师的人尝试的C巫术引起的,有点像巫师的学徒。我认为这对99级的巫师来说应该是显而易见的,或者如果有人能建议一种更现代的方法来做这件事,请告诉我

谢谢, 意志

这将按值传递
c
。此函数中对
c
的修改不会反映回调用者

您需要改为通过指针(引用)传递

但最好只返回坐标

Coordinate c = getCoordinateFromData([vertices objectAtIndex:i]);

Coordinate getCoordinateFromData(NSData* d) {
  Coordinate c;
  [d getBytes:&c];   // and let's not waste time allocating 12 bytes.
  return c;
}

顺便说一句,按照约定,结构是封装在中的,而不是NSData

[vertices addObject:[NSValue valueWithBytes:&c withObjCType:@encode(Coordinate)]];

Coordinate getCoordinateFromData(NSValue* d) {
  Coordinate c;
  [d getValue:&c];
  return c;
}
void fillCoordinateFromData(Coordinate c, NSData *d) {
fillCoordinateFromData(&c, [vertices objectAtIndex:i]);

void fillCoordinateFromData(Coordinate* pc, NSData *d) {
    void *bytes = malloc(12);
    [d getBytes:bytes];
    memcpy((void *)c, &bytes, 12);
    free(bytes);
}
Coordinate c = getCoordinateFromData([vertices objectAtIndex:i]);

Coordinate getCoordinateFromData(NSData* d) {
  Coordinate c;
  [d getBytes:&c];   // and let's not waste time allocating 12 bytes.
  return c;
}
[vertices addObject:[NSValue valueWithBytes:&c withObjCType:@encode(Coordinate)]];

Coordinate getCoordinateFromData(NSValue* d) {
  Coordinate c;
  [d getValue:&c];
  return c;
}