1

struct型のNSMutableArrayを実装するためのobjective-Cのサンプルコードがあるかどうか疑問に思いました。内部では、構造体で宣言された2つの可変配列(NSMutableArrayを介して)が必要です。私の本のすべてのコードサンプルは、C配列構文(角かっこ付き)を使用して定義されたサイズの配列を作成する方法を示していますが、NSMutableArrayを使用して配列を作成する方法がわかりません。他の誰かが以前にこれをしたことがありますか?これまでの私のコードは次のとおりです...正常にコンパイルされます配列のサイズを定義しました(以下のコードでは例として2と5を使用していますが、変更可能にするために設定する必要があります。 int、double、short、long、BOOLなどの「理解しやすい」データ型がいくつかある場合の単純な構造体(わかります)。ただし、ポインターに入ると、これは私が迷子になるところです(私はポインターをうまく使うことができますが、それらを構造体に入れる方法を知ることは難しい部分です)。コードがNSMutableArrayで機能するようになったら、「ネットワーク」タイプへのポインターとして「ネットワーク」をインターフェイスに配置しますか?以前に試しましたが、エラーが発生しました。結局、基本的には書けるようになりたいです

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

タイプ「ネットワーク」の任意に定義された配列。2つのNSMutableArrayの構造体を含む「ネットワーク」タイプの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
4

2 に答える 2

2

NSArrayとNSMutableArrayにはObjective-Cオブジェクトしか含めることができないため、構造体を格納することはできません。内容が構造体である必要があり、NSArrayに似たものが必要な場合は、10.5以降で使用可能なNSPointerArrayを使用してください。

他のポインタ型と同じように、構造体内にObjective-Cオブジェクト(NSPointerArray*またはなど)へのポインタを格納できます。idたとえば、次のように、Objective-Cオブジェクトを格納する二重リンクリストノードの構造体を宣言できます。

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

この__strong属性は、Objective-Cオブジェクトへのポインターが強力な参照として機能するため、Objective-C 2.0のガベージコレクションに関連して使用されますが、Cポインタータイプはデフォルトでは機能しません。このように、リスト内の1つのノードが__strong参照から参照されている限り、リストが消えることはありません。(詳細については、ガベージコレクションプログラミングガイドをお読みください。特に、ガベージコレクションでのCore Foundationの使用の後半をお読みください。)構造体に対してこれを行うことを検討することをお勧めします。

希望する構文に関しては、質問を完全には理解していない可能性がありますが、ブラケット構文を使用してNSPointerArrayなどのCocoaコレクション内のオブジェクトにアクセスすることはできません。(また、構造体はヒープに割り当てられる可能性が高いため、構造体->には「」ではなく「」演算子を使用する必要.がある可能性があります。すべてのObjective-Cオブジェクトは必要であり、必要になると思います。これらの構造体をメソッドのローカルスコープ外に格納します。)

Objective-Cにはジェネリックスがないため、「構造体型のNSMutableArrayを実装する」こともできません。実際、以前のSOの質問の1つには、この主題に関する詳細があります。それがあなたの意図したことではない場合は、遠慮なく明確にしてください。

于 2009-07-16T07:37:00.430 に答える
1

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

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

  1. 構造体の代わりに値オブジェクトを使用して、値を格納します。

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

    @interface Network : NSObject {
        // ivars
    }
    
    - (void) setInput:(double)value atIndex:(NSInteger)valueIndex ofInputAtIndex:(NSInteger)inputIndex;
    - (double) outputAtIndex:(NSInteger)index;
    @end
    
  3. すでに行っているように構造体を使用するだけです。事前にサイズを変更する必要がある場合は、友達の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. Networkオブジェクトを提示してアイデア2と3を組み合わせますが、構造体を使用して値を内部的に格納します。入力と出力の数が非常に多い場合、これはおそらく良い考えです。

于 2009-07-16T13:41:27.110 に答える