Определение вложенных массивов рекурсивных структур

У меня есть простая рекурсивная структура под названием Recursive и я хочу, чтобы его константный массив был инициализирован значениями, которые нужны программе. Затем я буду использовать простую функцию итератора под названием IterateAux и я называю это в main, Посмотрите на код до сих пор:

#include <iostream>
#include <string>

struct Recursive
{
    std::string data;
    Recursive* Children;
};

void IterateAux(Recursive* Item)
{
    int i = -1;
    while (Item[++i].data != "")
    {
        std::cout << Item[i].data << "\n";
        if (Item[i].Children)
            IterateAux(Item[i].Children);
    }
}

int main()
{
    IterateAux( (Recursive*)Parent );
    return 0;
}

Теперь, если у меня есть такие массивы const, это работает:

const Recursive Children[] =  {
    {"Child1", NULL},
    {"Child2", NULL},
    {"", NULL}
};

const Recursive Parent[] = {
    {"Parent1", NULL},
    {"Parent2", NULL},
    {"Parent3", Children },
    {"", NULL}
};

Но следующая вложенная форма не будет:

const Recursive Parent[] = {
    {"Parent1", NULL},
    {"Parent2", NULL},

    {"Parent3", (Recursive[])
        {
            {"Child1",NULL},
            {"Child2",NULL},
            {"", NULL}
        }
    },
    {"", NULL}
};

И вопрос почему? Как я могу заставить это работать?

В моих исследованиях сначала я думал, что .children указатель может быть недействительным, но при попытке с int данные вместо std::string это работало без нареканий.

С std::string данные GDB вылетает с сообщением During startup program exited with code 0xc0000135. так что я даже не могу отладить программу! Возможно код инициализации массива делает беспорядок где-нибудь...

Пробовал все это на GCC 4.6.

1 ответ

С небольшой работой я могу заставить ее появиться в GDB. Установка точки останова в операторе while в IterateAux. Это происходит через Parent, а затем, когда я перехожу к делу Children, я вижу это в рабочем случае:

(gdb) p Item[0]
$2 = {data = "Child1", Children = 0x0}

и это в случае неудачи:

(gdb) p Item[0]
$2 = {data = <error reading variable: Cannot access memory at address 0xfffffff4>,
Children = 0x48d24d79}

Таким образом, похоже, что приведение к Recursive[] скрывает тот факт, что он не компилируется в ту же форму, что и первый случай.

Я компилирую с g++ 4.6.3 с -Wall и не получаю предупреждений.

Другие вопросы по тегам