안에 nsmutablearray를 포함하는 구조물 유형의 nsmutablearray를 작성하는 방법은 무엇입니까?

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

문제

Objective-C에 대한 샘플 코드가 있는지 궁금합니다. 내부에는 구조물에 2 개의 돌연변이가있는 배열 (nsmutablearray를 통해)이 있어야합니다. 내 책의 모든 코드 샘플은 C 배열 구문 (브래킷 포함)을 통해 정의 된 크기의 배열을 만드는 방법을 보여 주지만 NSMutableArray와 함께 하나를 얻는 방법을 모르겠습니다. 다른 사람이 전에 이것을 한 적이 있습니까? 지금까지 내 코드가 있습니다 ... 잘 컴파일됩니다. 배열의 크기를 정의했습니다 (2와 5는 아래 코드에서 예제로 사용되지만 변경할 수 있도록 설정해야합니다. 간단한 구조는 int, double, short, long, bool과 같은 "이해하기 쉬운"데이터 유형을 가질 때 간단한 구조 (아이디어를 얻습니다). 그래도 포인터에 들어가면 내가 잃어버린 곳입니다 (i. 포인터를 잘 사용할 수는 있지만 구조물에 넣는 방법을 아는 것은 어려운 부분입니다.) 코드가 NSMutableArray와 함께 작동하면 인터페이스에 "네트워크"를 "네트워크"를 입력하는 포인터로 "네트워크"를 넣을 수 있습니까? , 그러나 나는 오류가 있습니다. 결국, 나는 기본적으로 글을 쓸 수 있기를 원합니다.

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

임의로 정의 된 유형의 "네트워크"배열에서. 누구나 NSMutableArray의 구조물을 포함하는 "네트워크"유형의 NSMutableAreray에 대한 정보에 대한 제안이나 링크를 제공 할 수 있습니까? 도움을 주셔서 감사합니다!

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]];
    
  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. 네트워크 객체를 제시하여 아이디어 2와 3을 결합하지만 내부적으로 값을 structs로 저장하십시오. 입력 및 출력 수가 매우 큰 경우에 좋은 생각 일 것입니다.

다른 팁

NSARRAY 및 NSMUTABLEARRAY에는 Objective-C 객체 만 포함 할 수 있으므로 구조를 저장할 수 없습니다. 내용이 구조 여야하고 nsarray와 비슷한 것을 원한다면 사용하십시오. nspointerArray, 10.5 이상으로 제공됩니다.

POINTERS를 목표 C 객체에 저장할 수 있습니다 (예 : NSPointerArray* 또는 id) 다른 포인터 유형과 마찬가지로 구조물 내부. 예를 들어, 이와 같은 대상 C 객체를 저장하는 이중 연결 목록 노드에 대한 구조물을 선언 할 수 있습니다.

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

그만큼 __strong 객관적인 C 객체에 대한 포인터는 강력한 참조로 작용하지만 C 포인터 유형은 기본적으로는 그렇지 않기 때문에 객체 C 2.0의 쓰레기 수집과 관련하여 속성이 사용됩니다. 이런 식으로, 목록의 하나의 노드가 __strong 참조에서 참조되는 한, 목록은 사라지지 않습니다. (읽기 쓰레기 수집 프로그래밍 안내서 자세한 내용, 특히 후반 쓰레기 수집과 함께 핵심 재단을 사용합니다.) 당신은 아마도 당신의 구조를 위해 이것을하는 것을 고려하고 싶을 것입니다.

원하는 구문까지, 나는 당신의 질문을 완전히 이해하지 못했을 수도 있지만, 당신은 nspointerarray와 같은 코코아 컬렉션에서 브래킷 구문을 사용하여 개체에 액세스 할 수 없습니다. (또한, 당신은 당신이 사용해야 할 것입니다.->"대신 운영자"."structs의 경우, 힙에 할당 될 가능성이 높기 때문에 모든 대물 렌즈 객체는 있어야하며,이 구조물을 방법의 로컬 범위 외부에 저장하고 싶다고 가정합니다.)

Objective-C에는 제네릭이 없으므로 "유형 구조물의 nsmutablearray를 구현할 수 없습니다". 사실로, 이전 SO 질문 중 하나입니다 주제에 대한 자세한 내용이 있습니다. 그것이 당신이 의미하지 않다면 자유롭게 명확하게하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top