2009-07-16 15 views
1

structの型のNSMutableArrayを実装する目的のために、そこにサンプルコードがあるのだろうかと思っていました。内部では、構造体で宣言された2つの可変配列(NSMutableArray経由でも)が必要です。私の書籍のすべてのコードサンプルは、C配列の構文(角括弧付き)で定義されたサイズの配列を作成する方法を示していますが、NSMutableArrayを使う方法を知りません。他の誰もこれを前にしていますか?ここで私のコードはこれまでです...コンパイルがうまくいきました。配列のサイズを定義しました(2と5は私のコードでは例として使用していますが、私はそれらを変更可能にする必要があります。 int、double、short、long、BOOLのような "分かりやすい"データ型をいくつか持てばシンプルな構造体が得られます(ポインタを取得するとこれが失われます)ポインタをうまく使うことができますが、構造体に入れる方法はわかります)コードがNSMutableArrayで動作したら、 "Network"をタイプするポインタとして "network"をインターフェイスに配置しますか?が、私は。最後に、私は基本的にタイプの任意に定義された配列の「ネットワーク」上の内部にNSMutableArrayも含まれている構造体型のNSMutableArrayを書き込む方法はありますか?

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

を書くことができるようにしたい。エラーを得た誰もが提案を提供できるかトンリンク2つのNSMutableArrayの構造体を含む "Network"型の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 

答えて

1

これは完全な回答ではありません。ポインタを構造体に配置する方法を知らないことによってどういう意味があるのか​​分かりません。私は、両方の動的な数で複数の入力と出力のネットワークをモデル化したいと仮定して進めます。

あなたがここではいくつかの選択肢があります。

[[[network inputs] objectAtIndex:2] replaceObjectAtIndex:1 withObject:[NSNumber numberWithDouble:5.0]]; 
  • モデルオブジェクトを使用してネットワーク::

    @interface Network : NSObject { 
        // ivars 
    } 
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex; 
    - (double) outputAtIndex:(NSInteger)index; 
    @end 
    
    1. 使用値は、あなたの値を格納する代わりに、構造体のオブジェクト

    2. あなたがすでにやっているように構造体を使うだけです。あなたはアップフロントサイズを変更する必要がある場合は、あなたの友人の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); 
      
    3. ネットワークオブジェクトを提示することによって、アイデア2と3を組み合わせたが、内部構造体と値を格納します。入力と出力の数が非常に多い場合、これはおそらく良い考えです。

    +0

    ガベージコレクションの設計も強くお勧めします。 mallocとcallocの代わりに、NSAllocateCollectableとNSMakeCollectableを調べるのは良いことです。 –

    2

    あなたがそれらで店舗の構造体ではないことができるようにNSArrayとNSMutableArrayのは、Objective-Cのオブジェクトのみを含めることができます。内容が構造体でなければならず、NSArrayと同様のものが必要な場合は、NSPointerArray(10.5以降で使用可能)を使用します。

    Objective-Cオブジェクトへのポインタ(NSPointerArray*またはidなど)を他のポインタ型と同じように構造体内に格納できます。ポインタ以来、__strong属性はObjective-Cの2.0でガベージコレクションに関連して使用される

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

    :たとえば、次のようなObjective-Cのオブジェクトを格納し、二重リンクリストのノードのための構造体を宣言することができObjective-Cオブジェクトは強い参照として動作しますが、Cのポインタ型はデフォルトではありません。この方法では、リスト内の1つのノードが__strong参照から参照される限り、リストは消えません。 (詳細はGarbage Collection Programming Guideを、特にの後半はガベージコレクションを使ったコア財団を参照してください。)あなたの構造体でこれを行うことをお勧めします。

    あなたが望む構文については、あなたの質問を完全に理解していないかもしれませんが、NSPointerArrayのようなCocoaコレクションのオブジェクトにアクセスするためにブラケット構文を使用することはできません。また、ヒープ上に割り当てられる可能性があるので、構造体には "."の代わりに "->"演算子を使用する必要があります。すべてのObjective-Cオブジェクトが存在する必要があります。

    Objective-Cにジェネリックがないので、 "struct [type]のNSMutableArrayを実装できません"。実際には、one of your previous SO questionsにはこの件に関する詳細があります。それがあなたの意図したものでない場合は、自由に説明してください。

    関連する問題