2012-03-11 82 views
3

我有一个返回变量的函数,我想知道如何返回数组的问题是它不是一个NSArray它只是一个平均C数组像这样...如何从Objective-C中的方法返回一个C数组?

-(b2Fixture*) addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shape 
{ 
    BodyDef *so = [shapeObjects objectForKey:shape]; 
    assert(so); 
     FixtureDef *fix = so->fixtures; 
    int count = -1; 
    b2Fixture *Fixi[4]; 
    while(fix) 
    { 

     count++; 
     NSLog(@"count = %d",count); 
     Fixi[count]= body->CreateFixture(&fix->fixture); 
     if (Fixi[count]!=0) { 
      NSLog(@"Fixi %d is not 0",count); 
     } 
     if (body->CreateFixture(&fix->fixture)!=0) { 
      NSLog(@"body %d is not 0",count); 
     } 

     fix = fix->next; 

    } 

    return *Fixi; 

} 

如果您看到一些你不知道的变量类型,因为我使用cocos2d框架来制作游戏,但是我返回了一个b2Fixture的变量......这段代码编译的只是保存了数组的第一个块的值“fixi [0]”不是整个数组像我想通过

anyhelp :)三江源

+3

如果你要返回一个C数组(任何东西),你打算如何分配它? (提示:它不能在被调用函数的堆栈中。) – 2012-03-11 00:45:10

回答

2

无法返回本地阵列。你需要做一些动态分配,或者像结构中的数组一样使用技巧。

Here is a link到一个深度的文章,应该会帮助你。

+1

我该怎么去做 – 2012-03-11 00:45:55

+0

['malloc(3)'](https://developer.apple.com/library/mac/ #documentation/Darwin/Reference/ManPages/man3/malloc.3.html),也许? – 2012-03-11 00:47:04

+0

一个非常真实的答案,但......应该扩展或引用无数其他答案之一。 – 2012-03-11 00:49:38

2

通常,按值返回C数组是个坏主意,因为数组可能是非常大的。 Objective-C数组是按引用类型的 - 它们是动态分配的,并且引用,即小的,就是传递的内容。您也可以动态分配C阵列,使用malloc系列之一进行分配,并使用free进行取消分配。

可以通过值传递C结构周围,这是常见的,如通用结构往往是(或短小反正)。

现在在你的情况下,你正在使用一个小阵列,它只有4个元素。 如果您考虑值周围传递这4个值是合理的,非常适合你的设计,你可以通过嵌入在C结构的C数组做如此简单:

typedef struct 
{ 
    b2Fixture *elements[4]; 
} b2FixtureArray; 

... 

-(b2FixtureArray) addFixturesToBody:(b2Body*)body forShapeName:(NSString*)shape 
{ 
    BodyDef *so = [shapeObjects objectForKey:shape]; 
    assert(so); 
    FixtureDef *fix = so->fixtures; 
    int count = -1; 
    b2FixtureArray Fixi; 
    while(fix) 
    { 
     count++; 
     NSLog(@"count = %d", count); 
     Fixi.elements[count]= body->CreateFixture(&fix->fixture); 
     if (Fixi.elements[count] != 0) 
     { 
      NSLog(@"Fixi %d is not 0",count); 
     } 
     if (body->CreateFixture(&fix->fixture) != 0) 
     { 
      NSLog(@"body %d is not 0", count); 
     } 

     fix = fix->next;  
    }  
    return Fixi;  
} 

... 

// sample call outline 
b2FixtureArray result = [self addFixturesToBody...] 

无论这个标准C根据值传递数组的“诀窍”适用于您必须决定的情况。

注意:如果b2fixture是一个Objective-C对象,请确保您了解具有取决于您正在使用的内存管理模型(MRC,ARC,GC)的C对象引用数组的内存管理含义。

+0

我将如何检索它正在返回的结构,即现在我会写b2fixture = function?因为它的结构和所有...我是否需要创建一个新的同类型结构 – 2012-03-11 01:13:27

+0

我得到一个错误,沿b2Fixture的行不能保存为b2FixtureArray不兼容的类型 – 2012-03-11 02:18:13

+0

@KingPopsicle - 最后一行显示如何调用它。标准C技术所做的是将数组作为结构的单个成员进行包装。因此,不用'array [index]',你可以在任何地方使用'structure.array [index]'。你得到的错误听起来像是你正试图将b2Fixture分配给结构而不是结构中的数组元素。 – CRD 2012-03-11 05:48:02

0

如果您需要设计必须返回固定或有限大小的数组的函数或方法,则有一种可能性是将指向结果数组的指针作为参数传递给函数或方法。然后调用者可以负责分配空间,或者只使用本地或实例变量数组。您可能希望被调用的函数在使用数组之前检查数组参数是否为NULL。

相关问题