1

USBデバイス情報を保存するツリーを構築しようとしています。この情報を含めるには、NSMutableArrayとNSMutableDictionaryを使用すると思いました。私の問題は、私がソフトウェアエンジニアリングを勉強したことがないということです-私は行くにつれて学んでいます-そして私は木の理論についてのかすかな考えを持っていません。
私は、8ニブルの長さのUSBロケーションIDに基づいてツリーを作成しています。私が理解しているように、各ニブルは木の層を表しています(私が何を意味するかがわかる場合)。ツリーを適切に構築できるかどうかを確認するために、テストコードを少し作成しました。残念ながら、作成できないようです。

#import <Foundation/Foundation.h>

#define MAXCHILDREN 0xf

NSDictionary* AddItemToTree(NSDictionary* nodeEntry, unsigned int value, int depth)
{
    // Convert the value into a set of nibbles
    char *bytes = (char *)&value;
    char byte = bytes[depth];

    NSMutableDictionary* thisEntry = [[[NSMutableDictionary alloc] initWithDictionary:nodeEntry] autorelease];

    if (byte == 0)
    {
        [thisEntry setObject:[NSString stringWithFormat:@"%08x",value] forKey:@"Value"];
        [thisEntry setObject:[NSString stringWithFormat:@"%08x",byte] forKey:@"Byte"];
        [thisEntry setObject:[NSNumber numberWithInt:depth] forKey:@"Depth"];

        return thisEntry;
    }



    if(![[thisEntry allKeys]containsObject:@"ChildEntries"])
    {
        NSMutableArray* childArray = [[NSMutableArray alloc]init];
        NSMutableDictionary* newNode = [[NSMutableDictionary alloc] init];

        [childArray addObject:AddItemToTree(newNode,value,++depth)];

        [thisEntry setObject:[NSNumber numberWithInt:depth] forKey:@"Depth"];
        [thisEntry setObject:[NSString stringWithFormat:@"%08x",value] forKey:@"Value"];
        [thisEntry setObject:[NSString stringWithFormat:@"%08x",byte] forKey:@"Byte"];
        [thisEntry setObject:childArray forKey:@"ChildEntries"];


        [newNode release];
        [childArray release];

    }
    else
    {
        [[thisEntry objectForKey:@"ChildEntries"]addObject:AddItemToTree(thisEntry,value, ++depth)];

    }


    return thisEntry;
}

int main(int argc, char *argv[]) {
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];


    NSMutableDictionary* treenode=[[NSMutableDictionary alloc]init];

    char bytearray[4] = {0x0F, 0x0F, 0x02, 0x00};
    unsigned int *value = (unsigned int*)bytearray;
    char bytearray2[4] = {0x0F, 0x02, 0x00, 0x00};
    unsigned int *value2 = (unsigned int*)bytearray2;
    char bytearray3[4] = {0x0F, 0x02, 0x00, 0x00};
    unsigned int *value3 = (unsigned int*)bytearray3;


    [treenode setObject:[NSNumber numberWithInt:0] forKey:@"Depth"];
    [treenode setObject:[NSString stringWithFormat:@"%08x",*value] forKey:@"Value"];
    [treenode setObject:AddItemToTree(treenode,*value, 0) forKey:@"ChildEntries"];

//    [[treenode objectForKey:@"ChildEntries"]addObject:AddItemToTree(treenode,*value2, 0)];


    [treenode writeToFile:@"/Users/headbanger/Desktop/test.plist" atomically:YES];

    [pool release];
}

USBロケーションIDを1つ追加すると完全に機能します。2番目を追加すると(メインの行のコメントを外すことにより)、SIGABRTが発生します。私はそれが完全に単純であると確信しています、そして私は典型的な初心者のエラーを犯しました。しかし、それは私には明らかではなく、あなたが提供できるどんな助けも大歓迎です。
私のツリーは次のようになる必要があります。

F-
 |--F-
 |   |--2
 |
 |--2

このツリーは、3番目のバイト配列を追加しようとしてもtrueである必要があります。
USBに特化せずに質問に答えることができれば、それが最も役立ちます。なぜなら、私は木と私が間違ったことについて本当に理解したいからです。そうは言っても、Objective-Cで私のためにツリーを構築するための迅速で簡単な方法があれば、それを聞いてみたいと思います。
専門家の皆さん、私が間違っていることを誰かに教えてもらえますか?お時間をいただきありがとうございます。

4

1 に答える 1