私はこのことを理解していると思っていましたが、ここで困惑しています。
次のように宣言された構造体があるとします。
typedef struct _Thing {
uint32_t type;
struct _Thing *children;
unsigned long childCount;
char *description;
union {
uint32_t thirtyTwoBitValue;
char *nameValue;
} data;
} Thing;
新しい Thing オブジェクトの追加に対応するために配列を再割り当てするメソッドがあります。次のようになります。
void AddTopLevelThing(Thing *thing)
{
Thing *oldThings = things;
things = malloc(sizeof(Thing) * thingCount +1);
// Add any existing things to the new array
for (int i = 0; i < thingCount; ++i) {
things[i] = oldThings[i];
}
// Add the newest thing to the new array
things[thingCount] = *thing;
// Increment the thing count
thingCount++;
}
注: things と thingCount はグローバルです。びっくりしないでください。;-) ああ、これが漏れていることにも気づきました。一度に1つの問題...
Thing オブジェクトを作成するために、初期化関数を作成しました。次のようになります。
Thing* CreateThingWithDescription(char *description)
{
Thing *thing = malloc(sizeof(Thing));
if (thing == NULL) {
printf("Bad thing!, Bad!\n");
return NULL;
}
// Initialize everything in the structure to 0
memset(thing, 0, sizeof(Thing));
thing->children = NULL;
thing->description = strdup(description);
return thing;
}
物事を複雑にするために (しゃれは意図していません)、Thing オブジェクトには、新しいオブジェクトが追加されたときに再割り当て (成長) される子の配列があります。次のようになります。
void AddChildThingToThing(Thing *parent, Thing *child)
{
Thing *oldChildren = parent->children;
parent->children = malloc(sizeof(Thing) * parent->childCount + 1);
if (parent->children == NULL) {
printf("Couldn't allocate space for thing children.\n");
parent->children = oldChildren;
return;
}
// Add any existing child things to the new array
for (int i = 0; i < parent->childCount; ++i) {
parent->children[i] = oldChildren[i];
}
// Add the newest child thing to the new array
parent->children[parent->childCount] = *child;
// Increment the child count
parent->childCount = parent->childCount + 1;
}
とにかく、構造体の作成と子構造体の追加が完了したときに、作成時に (デバッガーで) 作成を検証したにもかかわらず、子構造体がしばしばゼロになる理由を理解するのに苦労しています。メインのコードの実行が終了すると、ツリー構造になるはずですが、代わりに、認識も理解もできない値の乱雑な混乱です。
とにかく、単純なものを見落としているだけだと思っています。
オブジェクト階層を構築する方法を確認したい場合は、これが私のメインです。
int main(int argc, const char * argv[])
{
things = NULL;
thingCount = 0;
Thing *thing = CreateThingWithDescription("This is thing 1");
SetThingName(thing, "Willy Johnson");
AddTopLevelThing(thing);
Thing *child = CreateThingWithDescription("This is child thing 1");
SetThingName(child, "Willy's Son");
AddChildThingToThing(thing, child);
child = CreateThingWithDescription("This is child thing 2");
SetThingName(child, "Willy's Daughter");
AddChildThingToThing(thing, child);
thing = CreateThingWithDescription("This is thing 2");
SetThingValue(thing, 700);
AddTopLevelThing(thing);
child = CreateThingWithDescription("This is child thing 3");
SetThingValue(child, 1024);
AddChildThingToThing(thing, child);
for (int i = 0; i < thingCount; ++i) {
PrintThing(&things[i]);
}
return 0;
}
注: これは、何が起こっているかを把握するための単なるデモ プロジェクトです。