Определение вложенных массивов рекурсивных структур
У меня есть простая рекурсивная структура под названием 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 и не получаю предупреждений.