Come scrivere un NSMutableArray di un tipo struct che comprende anche NSMutableArray all'interno di esso?

StackOverflow https://stackoverflow.com/questions/1135462

Domanda

Mi chiedevo se c'è qualche codice di esempio là fuori per obiettivo-C per implementare una NSMutableArray di tipo struct. All'interno, ho bisogno che ci sia 2 campi mutabili (via NSMutableArray anche) dichiarato nella struct. Tutti gli esempi di codice nel mio libro mi mostrano come creare un array di dimensioni definite tramite la sintassi di matrice C (con le parentesi), ma non so come ottenere uno che va con NSMutableArray. Qualcun altro ha fatto prima? Ecco il mio codice finora ... Si compila bene ho definito la dimensione degli array (2 e 5 sono utilizzati nel mio codice di seguito come esempio, ma ho bisogno di impostarlo in modo che io possa avere loro mutevole. Posso lavorare con semplici le strutture quando hanno solo alcune delle I "più facile da comprendere" i tipi di dati come int, double, corto, lungo, BOOL (si ottiene l'idea). quando si arriva in puntatori, però, questo è dove divento perduto ( può usare puntatori bene, ma sapere come metterli in una struttura è la parte più difficile). una volta che il codice sta lavorando con NSMutableArray di, avrei messo "in rete" nell'interfaccia come un puntatore al tipo "rete"? ho provato questo prima , ma ho avuto errori. alla fine, ho praticamente voglio essere in grado di scrivere

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

su una serie arbitrariamente definita di tipo "Rete". Qualcuno potrebbe offerta suggerimento o link a informazioni su come rendere un NSMutableArray di tipo "Rete", che comprende una struttura di due NSMutableArray di? Grazie per qualsiasi aiuto!

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
È stato utile?

Soluzione

Questo non è essere una risposta completa; Non sono sicuro di cosa si intende per non sapere come mettere i puntatori a strutture. Ho intenzione di procedere per supponendo che si desidera modellare una rete di molteplici ingressi e uscite con un numero dinamica di entrambi.

Avete alcune scelte qui:

  1. Usa il valore degli oggetti, invece di struct per archiviare i valori:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]];
    
  2. Modello della rete con un oggetto:

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. Proprio utilizzare le strutture come si sta già facendo; se è necessario modificare le dimensioni up-front, utilizzare il vostro amico 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. Combina idee 2 e 3 con la presentazione di un oggetto di rete ma internamente memorizzare i valori con le strutture. Questa è probabilmente una buona idea se il numero di ingressi e uscite è molto grande.

Altri suggerimenti

NSArray e NSMutableArray può contenere solo oggetti Objective-C, quindi non è possibile memorizzare le strutture a loro. Se i contenuti devono essere le strutture e si desidera qualcosa di simile a NSArray, utilizzare NSPointerArray , disponibile in 10.5 e versioni successive.

È possibile memorizzare puntatori a oggetti Objective-C (come NSPointerArray* o id) all'interno di una struttura come qualsiasi altro tipo di puntatore. Ad esempio, è possibile dichiarare una struct per un nodo lista doppiamente collegata che memorizza un oggetto Objective-C in questo modo:

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

L'attributo __strong è usato in connessione con la raccolta dei rifiuti in Objective-C 2.0, dal momento che puntatori a oggetti Objective-C agiscono come riferimenti forti, ma tipi di puntatore C non fanno per impostazione predefinita. In questo modo, fino a quando un nodo nella lista viene fatto riferimento da un riferimento __strong, l'elenco non scomparirà. (Leggi la Garbage Collection Guida di programmazione per dettagli, ed in particolare nella seconda metà del Uso Nucleo Fondazione con Garbage Collection .) probabilmente prendere in considerazione facendo questo per le vostre strutture.

Per quanto riguarda la sintassi desiderato, non posso aver pienamente compreso la tua domanda, ma non sarà in grado di utilizzare la sintassi staffa per accedere agli oggetti in una collezione di cacao come un NSPointerArray. (Inoltre, le probabilità sono dovrete utilizzare l'operatore "->" invece di "." per le struct, dato che sono suscettibili di essere allocato sul mucchio. Tutti gli oggetti Objective-C deve essere, e io ti assumere' ll desidera memorizzare queste le strutture al di fuori del campo di applicazione locale di un metodo.)

Dal Objective-C non ha farmaci generici, anche voi non può "implementare [un] NSMutableArray di tipo struct". In realtà, una delle tue precedenti domande in modo ha maggiori dettagli su questo argomento. Se questo non è quello che volevi dire, sentitevi liberi di chiarire.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top