Hvordan skrive en NSMutableArray av en struct type som også inkluderer NSMutableArray innsiden av det?

stemmer
1

I lurer om det er noen eksempelkode ute for objektiv-C for å implementere en NSMutableArray av type struct. Innsiden, Jeg trenger det å være 2 foranderlig arrays (via NSMutableArray også) deklarert i struct. Alle kodeeksempler i boken min vise meg hvordan å lage en rekke definerte størrelsen via C array syntaks (med parentes), men jeg vet ikke hvordan du får en gang med NSMutableArray. Har noen andre gjort dette før? Her er koden min så langt ... Det kompilerer fint jeg har definert størrelsen på arrays (2 og 5 er brukt i min kode nedenfor som et eksempel, men jeg trenger å sette den slik at jeg kan ha dem foranderlig. Jeg kan jobbe med enkle structs når de bare har noen av de lettere å forstå datatyper som int, double, korte, lange, BOOL (du skjønner poenget). når det kommer inn tips om dette er hvor jeg blir borte (jeg kan bruke pekere fine, men å vite hvordan du skal sette dem i en struct er den vanskelige delen). Når koden er å jobbe med NSMutableArray tallet, ville jeg sette nettverk i grensesnittet som en peker til å skrive Network? jeg prøvde dette før , men jeg fikk feil. til slutt, jeg i utgangspunktet vil være i stand til å skrive

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

på en vilkårlig definert matrise av typen Network. Kunne noen tilbud forslag eller linker til informasjon om å lage en NSMutableArray av typen Network som inkluderer en struct av to NSMutableArray s? Takk for hjelp!

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
Publisert på 16/07/2009 klokken 05:02
kilden bruker
På andre språk...                            


2 svar

stemmer
2

NSArray og NSMutableArray kan bare inneholde Objective-C objekter, så du kan ikke lagre structs i dem. Hvis innholdet må være structs og du vil ha noe som ligner på NSArray, bruke NSPointerArray , tilgjengelig i 10.5 og senere.

Du kan lagre pekere til Objective-C objekter (for eksempel NSPointerArray*eller id) inne i en struct akkurat som alle andre peker type. For eksempel kan du erklære en struct for en dobbelt-lenket liste node som lagrer en Objective-C objekt som dette:

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

Den __strongattributtet brukes i forbindelse med søppelrydding i Objective-C 2,0, siden pekere til Objective-C gjenstander fungere som sterke referanser, men C pekertyper ikke som standard. På denne måten, så lenge en node i listen er referert fra en __strong referanse, listen vil ikke forsvinne. (Les Garbage Collection Programming Guide for detaljer, og spesielt i andre halvdel av å bruke Core Foundation med Garbage Collection .) Du vil sannsynligvis ønske å vurdere å gjøre dette for dine structs.

Så langt som ønsket syntaks, kanskje jeg ikke har forstått spørsmålet ditt, men du vil ikke kunne bruke braketten syntaks for å få tilgang til objekter i en Cocoa samlinger som en NSPointerArray. (Også, oddsen er at du må bruke " ->" operator i stedet for " ." for structs, siden de er sannsynlig å bli tildelt på haugen. Alle Objective-C gjenstander må være, og jeg antar du vil å lagre disse structs utenfor det lokale omfanget av en metode).

Siden Objective-C ikke har generics, du kan heller ikke "gjennomføre [en] NSMutableArray av type struct". Faktisk en av dine tidligere SO spørsmål har mer detaljer om emnet. Hvis det er ikke hva du mente, gjerne avklare.

Svarte 16/07/2009 kl. 07:37
kilden bruker

stemmer
1

Dette er ikke et fullstendig svar; Jeg er ikke sikker på hva du mener med å ikke vite hvordan du skal sette pekere i structs. Jeg kommer til å fortsette ved å anta at du ønsker å modellere et nettverk av flere innganger og utganger med en dynamisk rekke begge deler.

Du har noen valg her:

  1. Bruksverdi objekter i stedet for structs å lagre dine verdier:

    [[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]];
    
  2. Modellere Network med et objekt:

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. Bare bruk structs som du allerede gjør; hvis du trenger å endre størrelsen up-front, bruke din venn 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. Kombiner ideer 2 og 3 ved å presentere et nettverk objekt, men internt lagre verdiene med structs. Dette er sannsynligvis en god ide hvis antall innganger og utganger er svært store.

Svarte 16/07/2009 kl. 13:41
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more