كيفية كتابة nsmutablerray من نوع الهيكل الذي يشمل أيضا nsmutablerray داخل ذلك؟

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

سؤال

كنت أتساءل عما إذا كان هناك أي رمز عينة هناك مقابل الهدف - ج- ج لتنفيذ nsmutablerray من نوع النوع. في الداخل، أحتاج إلى أن يكون هناك 2 صفائف متغيرة (عبر NSMutablerray أيضا) أعلن في الهيكل. تظهر لي جميع عينات التعليمات البرمجية في كتابي كيفية جعل مجموعة من الحجم المحدد عبر بناء جملة صفيف C (مع الأقواس)، لكنني لا أعرف كيفية الحصول على الذهاب إلى NSMutablerrray. هل قام أي شخص آخر بذلك من قبل؟ إليك الكود الخاص بي حتى الآن ... إنه يجمع بشكل جيد لقد حددت حجم المصفوفات (2 و 5 تستخدم في التعليمات البرمجية أدناه كمثال، لكنني بحاجة إلى تعيينه حتى أتمكن من الحصول عليها. يمكنني العمل مع البناط البسيطة عندما يكون لديهم بعض أنواع البيانات "أسهل لفهم" مثل int، مزدوجة، قصيرة، طويلة، BOOL (تحصل على الفكرة). عندما يحصل في مؤشرات على الرغم من ذلك، فإن هذا هو المكان الذي أصبح فيه فقدان (أنا يمكن استخدام المؤشرات بشكل جيد، ولكن معرفة كيفية وضعها في بنية هي الجزء الصعب). بمجرد أن يعمل الكود مع NSMutablerray's، هل سأضع "شبكة" في الواجهة كمؤشر لكتابة "شبكة"؟ حاولت هذا من قبل ، لكنني حصلت على أخطاء. في النهاية، أريد أن أكون قادرا على الكتابة

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

على مجموعة محددة بشكل تعسفي من النوع "الشبكة". هل يمكن لأي شخص تقديم اقتراح أو روابط للحصول على معلومات حول جعل NSMutablearray من النوع "الشبكة" والتي تتضمن منظم اثنين من nsmutablerray؟ شكرا على اي مساعدة!

somfile.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 عن طريق تقديم كائن شبكة ولكن تخزين القيم داخليا مع الهياكل. ربما تكون هذه فكرة جيدة إذا كان عدد المدخلات والمخرجات كبيرة جدا.

نصائح أخرى

يمكن أن يحتوي NSARRAY و NSMutablerray على كائنات موضوعية C، لذلك لا يمكنك تخزين الهياكل فيها. إذا كانت المحتويات يجب أن تكون هياكل وتريد شيئا مشابها ل NSArray، فاستخدم nspointerarray., ، متاح في 10.5 والإصدارات الأحدث.

يمكنك تخزين المؤشرات إلى كائنات الهدف C (مثل NSPointerArray* أو id) داخل بنية تماما مثل أي نوع مؤشر آخر. على سبيل المثال، يمكنك إعلان بنية لعقدة قائمة مرتبطة مضاعفة تخزن كائن موضوعي C مثل هذا:

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

ال __strong يتم استخدام السمة فيما يتعلق بجمع القمامة في الهدف - C 2.0، نظرا لأن مؤشرات كائنات الهدف - C تعمل كمراجع قوية، ولكن أنواع مؤشر C لا تقسم افتراضيا. بهذه الطريقة، طالما تمت الإشارة إلى عقدة واحدة في القائمة من مرجع __Strong، فلن تختفي القائمة. (إقرأ ال دليل برمجة جمع القمامة للحصول على التفاصيل، وخاصة النصف الثاني من باستخدام الأساس الأساسية مع جمع القمامة.) ربما تريد أن ترغب في التفكير في القيام بذلك من أجل بنياتك.

بقدر بناء الجملة المرغوب فيه، قد لا أفهم سؤالك بالكامل، لكنك لن تتمكن من استخدام بناء جملة القوس للوصول إلى الكائنات في مجموعات الكاكاو مثل nspointeraRay. (أيضا، احتمالات أن تضطر إلى استخدام "->"المشغل بدلا من"."بالنسبة للوليد، نظرا لأنهم من المحتمل أن يتم تخصيصهم على كومة الكومة. يجب أن تكون جميع الأشياء الموضوعية C، وأفترض أنك تريد تخزين هذه الهياكل خارج نطاق الأسلوب المحلي.)

نظرا لأن الهدف - C ليس لديه أعداد، لا يمكنك أيضا "تنفيذ [ANT] NSMutablerray من نوع النوع". حقيقة، واحدة من الأسئلة السابقة الخاصة بك لديه المزيد من التفاصيل حول هذا الموضوع. إذا لم يكن هذا ما تعنيه، فلا تتردد في توضيحه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top