Как вернуть C-массив из метода в Objective-C? - PullRequest
3 голосов
/ 11 марта 2012

У меня есть функция, которая возвращает переменную, и я хочу знать, как вернуть массив, проблема в том, что это не NSArray, это просто средний массив 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 :) thankyou

Ответы [ 3 ]

2 голосов
/ 11 марта 2012

Обычно возвращать массивы C по значению - плохая идея, поскольку массивы могут быть очень большими .Массивы Objective-C являются типами ссылок: они распределяются динамически, а ссылка, которая равна small , - это то, что передается.Вы также можете динамически распределять массивы C, используя одно из семейств malloc для выделения и free для освобождения.

Вы можете передавать структуры C по значению, и это обычно, как в общих структурахкак правило, small (или smallish в любом случае).

Теперь в вашем случае вы используете небольшой массив, в котором всего 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).

2 голосов
/ 11 марта 2012

Вы не можете вернуть локальный массив.Вам нужно будет выполнить какое-то динамическое выделение или использовать хитрость, например, массив в структуре.

Вот ссылка на углубленную статью, которая должна помочь.

0 голосов
/ 11 марта 2012

Если вам нужно спроектировать функцию или метод, который должен возвращать массив фиксированного или ограниченного размера, одна возможность - передать указатель на массив результатов функции или методу в качестве параметра.Затем вызывающая сторона может позаботиться о выделении места или просто использовать локальный массив или массив переменных экземпляра.Возможно, вы захотите, чтобы вызываемая функция проверяла, что параметр массива не равен NULL перед использованием массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...