Comment écrire un NSMutableArray d'un type struct qui comprend également NSMutableArray à l'intérieur de celui-ci?

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

Question

Je me demandais s'il y a un exemple de code là pour Objective-C pour la mise en œuvre d'un NSMutableArray de type struct. , J'ai besoin à l'intérieur qu'il y ait 2 tableaux mutables (via NSMutableArray également) déclarai dans le struct. Tous les exemples de code dans mon livre me montrer comment faire un tableau de taille définie par C syntaxe de tableau (avec les crochets), mais je ne sais pas comment obtenir un aller avec NSMutableArray. Quelqu'un at-il fait autre chose avant? Voici mon code jusqu'à présent ... Il compile bien que je l'ai défini la taille des tableaux (2 et 5 sont utilisés dans mon code ci-dessous comme un exemple, mais je dois le mettre donc je peux les avoir mutable. Je peux travailler avec simples struct quand ils ont quelques-uns des « plus facile à comprendre » types de données comme int, double, court, long, BOOL (vous voyez l'idée). quand il est en pointeurs cependant, c'est là que je deviens perdu (I peut utiliser des pointeurs bien, mais savoir comment les mettre dans une struct est la partie difficile). une fois que le code fonctionne avec de NSMutableArray, je mettrais « réseau » dans l'interface comme un pointeur de type « réseau »? J'ai essayé avant , mais je suis arrivé erreurs. En fin de compte, je veux essentiellement être capable d'écrire

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

sur un tableau défini arbitrairement de type « réseau ». Quelqu'un pourrait-il suggéré d'offre ou des liens vers des informations sur la création d'un NSMutableArray de type « réseau » qui comprend une struct de deux NSMutableArray de? Merci pour toute aide!

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
Était-ce utile?

La solution

est être pas une réponse complète; Je ne sais pas ce que vous entendez par ne pas savoir comment mettre des pointeurs dans struct. Je vais procéder par vous supposant que vous voulez modéliser un réseau de plusieurs entrées et sorties avec un nombre dynamique à la fois.

Vous avez quelques choix ici:

  1. valeur Utilisez les objets au lieu de struct pour stocker vos valeurs:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]];
    
  2. Modèle de votre réseau avec un objet:

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. Il suffit d'utiliser struct comme vous faites déjà; si vous avez besoin de changer la taille à l'avance, utilisez votre ami 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. Combiner des idées 2 et 3 en présentant un objet réseau, mais stocker en interne les valeurs avec struct. Ceci est probablement une bonne idée si le nombre d'entrées et de sorties est très grande.

Autres conseils

NSArray et NSMutableArray ne peut contenir des objets Objective-C, vous ne pouvez pas stocker struct en eux. Si le contenu doit être struct et que vous voulez quelque chose de similaire à NSArray, utilisez NSPointerArray , disponible en 10.5 et versions ultérieures.

Vous pouvez stocker des pointeurs vers des objets Objective-C (comme NSPointerArray* ou id) à l'intérieur d'une struct comme tout autre type de pointeur. Par exemple, vous pouvez déclarer une struct pour un noeud de liste doublement chaînée qui stocke un objet Objective-C comme ceci:

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

L'attribut __strong est utilisé dans le cadre de la collecte des ordures dans Objective-C 2.0, étant donné que des pointeurs vers des objets Objective-C agissent comme de solides références, mais C types de pointeur ne le font pas par défaut. De cette façon, tant que l'un nœud dans la liste est référencée à partir d'une référence __strong, la liste ne disparaîtra pas. (Lire le Garbage Collection Guide de programmation détails, et en particulier la seconde moitié de Utilisation de Core Foundation avec Garbage Collection .) Vous voudrez probablement envisager de le faire pour vos struct.

En ce qui concerne votre syntaxe désirée, je n'ai bien compris votre question, mais vous ne serez pas en mesure d'utiliser la syntaxe de support pour accéder aux objets dans une collection de cacao comme un NSPointerArray. (De plus, les chances sont que vous devrez utiliser l'opérateur « -> » au lieu de « . » pour les struct, car ils sont susceptibles d'être alloués sur le tas. Tous les objets Objective-C doivent être, et je vous assumez » ll veulent stocker ces struct en dehors du champ d'application locale d'une méthode.)

Depuis Objective-C n'a pas génériques, vous pouvez aussi ne pas "mettre en œuvre [un] NSMutableArray de type struct". En fait, un de vos précédents SO des questions a plus de détails sur le sujet. Si ce n'est pas ce que vous vouliez dire, ne hésitez pas à préciser.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top