Как написать NSMutableArray типа структуры, который также включает в себя NSMutableArray внутри него? - PullRequest
1 голос
/ 16 июля 2009

Мне было интересно, есть ли какой-нибудь пример кода для target-C для реализации NSMutableArray типа struct. Внутри мне нужно, чтобы в структуре было 2 изменяемых массива (также через NSMutableArray). Все примеры кода в моей книге показывают мне, как создать массив определенного размера с помощью синтаксиса массива C (с квадратными скобками), но я не знаю, как его создать с NSMutableArray. Кто-нибудь еще делал это раньше? Вот мой код до сих пор ... Он хорошо компилируется. Я определил размер массивов (2 и 5 используются в моем коде ниже в качестве примера, но мне нужно установить его, чтобы они могли быть изменяемыми. Я могу работать с простые структуры, когда у них просто есть некоторые из «более простых для понимания» типов данных, таких как int, double, short, long, BOOL (вы понимаете). Однако, когда он попадает в указатели, я тут теряюсь (я может хорошо использовать указатели, но знание того, как поместить их в структуру, является трудной частью.) Как только код работает с NSMutableArray, я бы поставил «сеть» в интерфейсе как указатель на тип «Сеть»? Я пробовал это раньше , но я получил ошибки. В конце концов, я хочу написать

network.input[2].list[1].value = 5.0;

для произвольно определенного массива типа «Сеть». Может ли кто-нибудь предложить предложение или ссылки на информацию о создании NSMutableArray типа «Сеть», который включает в себя структуру из двух NSMutableArray? Спасибо за любую помощь!

SomeFile.h

#import <Foundation/Foundation.h>

struct lists{
    double value;
};

// supporting structs
struct inputs{
    struct lists list[2];
};

struct Network {
    struct inputs input[5];
    struct lists output[5];
}

@interface SomeFile : NSObject {

}

@end

SomeFile.m

#import "SomeFile.h"
@implementation SomeFile
@end

Ответы [ 2 ]

2 голосов
/ 16 июля 2009

NSArray и NSMutableArray могут содержать только объекты Objective-C, поэтому вы не можете хранить в них структуры. Если содержимое должно быть структурным и вам нужно что-то похожее на NSArray, используйте NSPointerArray , доступный в 10.5 и более поздних версиях.

Вы можете хранить указатели на объекты Objective-C (например, NSPointerArray* или id) внутри структуры, как и любой другой тип указателя. Например, вы можете объявить структуру для двусвязного узла списка, в котором хранится объект Objective-C, например:

typedef struct DoublyLinkedListNode {
    id object;
    __strong struct DoublyLinkedListNode *next;
    __strong struct DoublyLinkedListNode *prev;
} DoublyLinkedListNode;

Атрибут __strong используется в связи с сборкой мусора в Objective-C 2.0, так как указатели на объекты Objective-C действуют как надежные ссылки, а типы указателей на C по умолчанию этого не делают. Таким образом, если на один узел в списке ссылаются из ссылки __strong, список не исчезнет. (Подробнее см. Руководство по программированию сборки мусора , и особенно вторую половину Использование Core Foundation с сборкой мусора .) Возможно, вы захотите рассмотреть возможность это для твоих структур.

Что касается вашего желаемого синтаксиса, я, возможно, не полностью понял ваш вопрос, но вы не сможете использовать скобочный синтаксис для доступа к объектам в коллекциях Какао, таких как NSPointerArray. (Кроме того, скорее всего, вам придется использовать оператор "->" вместо "." для структур, так как они, вероятно, будут размещены в куче. Все объекты Objective-C должны быть, и Я предполагаю, что вы захотите хранить эти структуры вне локальной области видимости метода.)

Поскольку Objective-C не имеет обобщений, вы также не можете "реализовать [NS] NSMutableArray типа struct". Фактически, один из ваших предыдущих вопросов SO содержит более подробную информацию по этому вопросу. Если это не то, что вы имели в виду, не стесняйтесь уточнять.

1 голос
/ 16 июля 2009

Это не полный ответ; Я не уверен, что вы имеете в виду, не зная, как поместить указатели в структуры. Я собираюсь продолжить, предполагая, что вы хотите смоделировать сеть из нескольких входов и выходов с динамическим числом обоих.

У вас есть несколько вариантов здесь:

  1. Используйте объекты значений вместо структур для хранения ваших значений:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]];
    
  2. Моделирование вашей сети с помощью объекта:

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. Просто используйте структуры, как вы уже делаете; если вам нужно изменить размер заранее, используйте ваш друг malloc:

    struct Network_value {
      double value;
    }
    
    struct Network {
        struct Network_value **inputs;
        struct Network_value *outputs;
    };
    
    void Network_alloc(Network *n, unsigned inputs, unsigned input_values, unsigned outputs) {
        n->outputs = calloc(sizeof(Network_value), outputs);
        n->inputs = calloc(sizeof(Network_value *), inputs);
        while (inputs --> 0) {
            n->inputs[inputs] = calloc(sizeof(Network_value), input_values);
        }
    }
    
    void Network_free(Network *n, unsigned inputs) {
        free(n->outputs);
        while (inputs --> 0) {
            free(n->inputs[inputs]);
        }
        free(n->inputs);
    }
    
    Network network;
    Network_alloc(&network, 5, 2, 5);
    
    network.inputs[2][1].value = 5.0;
    
    Network_free(&network, 2);
    
  4. Объедините идеи 2 и 3, представив сетевой объект, но внутренне сохраните значения со структурами. Вероятно, это хорошая идея, если количество входов и выходов очень велико.

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