Cómo escribir una NSMutableArray de un tipo de estructura que también incluye NSMutableArray dentro de ella?

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

Pregunta

Me preguntaba si hay algún código de ejemplo que hay para Objective-C para la implementación de un NSMutableArray del tipo de estructura. En el interior, necesito que haya 2 arrays mutables (vía NSMutableArray también) declarados en la estructura. Todos los ejemplos de código de mi libro me muestran cómo hacer una matriz de tamaño definido a través de la sintaxis de matrices C (con los corchetes), pero no saben cómo conseguir uno que va con NSMutableArray. ¿Alguien más ha hecho esto antes? Aquí está mi código hasta ahora ... Se compila bien he definido el tamaño de las matrices (2 y 5 se utilizan en mi código de abajo como un ejemplo, pero tengo que configurarlo para que pueda tenerlas mutable. Puedo trabajar con estructuras simples cuando lo único que tienen algunos de los que "más fácil de entender" tipos de datos como int, double, corto, largo, BOOL (se entiende la idea). cuando se mete en punteros embargo, aquí es donde se pierden ( puede utilizar punteros bien, pero saber cómo ponerlos en una estructura es la parte difícil). una vez que el código está trabajando con NSMutableArray de, iba a poner "red" en la interfaz como un puntero de tipo "red"? he intentado esto antes , pero tengo errores. al final, básicamente quiero ser capaz de escribir

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

sobre una matriz definida arbitrariamente de tipo "Red". Se le puede ofrecer sugerencia o enlaces a información sobre cómo hacer una NSMutableArray del tipo "Red", que incluye una estructura de dos NSMutableArray de? Gracias por cualquier ayuda!

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
¿Fue útil?

Solución

Esto no es ser una respuesta completa; No estoy seguro de lo que entendemos por no saber cómo poner punteros en estructuras. Voy a proceder asumiendo que desea modelar una red de múltiples entradas y salidas con un número dinámico de ambos.

Usted tiene algunas opciones aquí:

  1. El valor de uso de objetos en lugar de estructuras para almacenar sus valores:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]];
    
  2. Modelo de su red con un objeto:

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. Sólo tiene que utilizar estructuras como ya se está haciendo; Si necesita cambiar el tamaño por adelantado, utilice su amigo 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. combinar ideas 2 y 3 mediante la presentación de un objeto de red pero internamente almacenan los valores con estructuras. Esta es probablemente una buena idea si el número de entradas y salidas es muy grande.

Otros consejos

NSArray y NSMutableArray sólo puede contener objetos Objective-C, por lo que no se puede almacenar estructuras en ellos. Si el contenido debe ser estructuras y desea algo similar a NSArray, usar NSPointerArray , disponible en 10.5 y posteriores.

Puede almacenar punteros a objetos de Objective-C (como NSPointerArray* o id) dentro de una estructura igual que cualquier otro tipo de puntero. Por ejemplo, se puede declarar una estructura para un nodo de la lista doblemente enlazada que almacena un objeto de Objective-C como esto:

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

El atributo __strong se utiliza en relación con la recolección de basura en Objective-C 2.0, ya que los punteros a objetos Objective-C actúan como referencias fuertes, pero los tipos de puntero C no lo hacen de forma predeterminada. De esta manera, siempre y cuando un nodo en la lista se hace referencia a partir de una referencia __strong, la lista no desaparecerá. (Lea la href="http://developer.apple.com/documentation/Cocoa/Conceptual/GarbageCollection/" rel="nofollow noreferrer"> Programación Garbage Collection Guía de detalles, y sobre todo la segunda mitad del Uso de la Fundación núcleo de recolección de elementos .) Es probable que desee considerar la posibilidad de hacer esto por sus estructuras.

En cuanto a su sintaxis deseada, puede que no han comprendido plenamente su pregunta, pero no voy a ser capaz de utilizar la sintaxis soporte para acceder a objetos en una colección de cacao como un NSPointerArray. (También, las probabilidades son que tendrá que utilizar el operador "->" en lugar de "." de las estructuras, ya que son propensos a ser asignada en el montón. Todos objetos de Objective-C debe ser, y os asumir' ll desea almacenar estas estructuras fuera del ámbito local de un método.)

Desde Objective-C no tiene genéricos, también no puede "poner en práctica [un] NSMutableArray del tipo de estructura". De hecho, uno de sus anteriores SO preguntas tiene más detalles sobre el tema. Si eso no es lo que quería decir, no dude en aclarar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top