Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2013, 14:25   #11
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
Только почему не отображаются все остальные уровни ё-маё?
Потому что их нет. А вот почему их нет?..
Abstraction вне форума Ответить с цитированием
Старый 12.04.2013, 14:34   #12
freekyn
Пользователь
 
Регистрация: 19.03.2013
Сообщений: 12
Восклицание

как нет, если я уже создал дерево, и если выведу их в той функции они есть.

если честно я не понимаю к чему вы клоните =/ кроме того, что их нужно создать, но они же есть уже.
опыт программирования у меня нулевой почти, если не считать морской консольный

объясните, или скажите что почитать, чтобы понять

Последний раз редактировалось freekyn; 12.04.2013 в 14:38.
freekyn вне форума Ответить с цитированием
Старый 12.04.2013, 15:16   #13
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
как нет, если я уже создал дерево, и если выведу их в той функции они есть.

если честно я не понимаю к чему вы клоните =/ кроме того, что их нужно создать, но они же есть уже.
То-то и оно, что Вы его создали, но не создали. Давайте посмотрим на функцию tree_go ещё раз:
Код:
void tree_go(struct tree *tree_1, int max_level, int current)
{
    tree_1=(struct tree*)malloc(sizeof(struct tree));
    tree_1->data=1+rand()%20;
    printf("\nlevel %d: %d", current, tree_1->data);
    if(current==max_level)
    {
        tree_1->left=0;
        tree_1->right=0;
    }
    else
    {
        tree_1->left=(struct tree*)malloc(sizeof(struct tree));
        tree_go(tree_1->left, max_level, current+1);
        tree_1->right=(struct tree*)malloc(sizeof(struct tree));
        tree_go(tree_1->right, max_level, current+1);
    }
}
Мы создали (с помощью malloc) указатель на tree data и вызвали tree_go. В tree_go передалась копия указателя data, с именем tree_1. В этот момент data==tree_1 и всё хорошо.
Но в первой же строке функции, Вы пишете в tree_1 другое значение! Всё, связь между tree_1 и data разорвана. Всё, что Вы будете делать с tree_1 дальше, не имеет к data никакого отношения.

Что же делать? "Классический" вариант - возвращать из tree_go указатель на дерево. Самому tree_go при этом аргумент в виде указателя на дерево не нужен:
Код:
//Функция
struct tree * tree_go(int max_level, int current)
{
    struct tree* tree_1=(struct tree*)malloc(sizeof(struct tree));
    tree_1->data=1+rand()%20;
    printf("\nlevel %d: %d", current, tree_1->data);
    if(current==max_level)
    {
        tree_1->left=0;
        tree_1->right=0;
    }
    else
    {
        tree_1->left = tree_go(max_level, current+1);
        tree_1->right = tree_go(max_level, current+1);
    }
    return tree_1;
}

//Использование
struct tree* data = tree_go(level,1);
Её можно ещё упростить, если вместо увеличения current уменьшать max_level (аргумент current при этом станет не нужен).

Альтернативный вариант - передавать указатель data в функцию по ссылке, а не по значению:
Код:
//Функция
void tree_go(struct tree **tree_1, int max_level, int current)//Указатель на указатель, да-да
{
    *tree_1=(struct tree*)malloc(sizeof(struct tree));
    (*tree_1)->data=1+rand()%20;
    printf("\nlevel %d: %d", current, (*tree_1)->data);
    if(current==max_level)
    {
        (*tree_1)->left=0;
        (*tree_1)->right=0;
    }
    else
    {
        tree_go(&(*tree_1)->left, max_level, current+1);
        tree_go(&(*tree_1)->right, max_level, current+1);
    }
}

//Использование
struct tree* data;
tree_go(&data, level, 1);
Обратите внимание на выкинутые malloc в обоих случаях. Один вызов tree_go создаёт один узел дерева, а значит, и malloc в нём должен вызываться один раз (иначе Вы создаёте 7 узлов и вызываете malloc 11 раз... не надо быть гуру, чтобы увидеть утечку памяти).
Abstraction вне форума Ответить с цитированием
Старый 12.04.2013, 17:45   #14
freekyn
Пользователь
 
Регистрация: 19.03.2013
Сообщений: 12
Восклицание

большое вам спасибо за объяснение, этого очень не хватает, все лишь пихают код

я понял свою ошибку, в следующий раз постараюсь не допускать такого
freekyn вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VBA код. Очистка листа и сортировка. riniks17 Microsoft Office Excel 15 15.02.2013 15:33
есть код и есть ощибка в чем ощибка? anton6262906 Общие вопросы C/C++ 11 23.12.2011 03:26
Есть код не могу скомпилить D0ct0r Общие вопросы C/C++ 4 08.12.2010 20:47
Есть у кого код приглашения? iamramirez Свободное общение 0 12.12.2009 23:34
Есть код!! Danilyuk Помощь студентам 1 31.05.2008 00:46