2013-03-07 2 views
0

Я пытаюсь реализовать N-арное дерево в C++, используя glib, но поскольку я не эксперт на C++, у меня возникают некоторые проблемы с поиском использования правильно. У кого-нибудь есть простой пример, написанный на C++, чтобы помочь мне понять, как использовать основные функции? У меня возникают особые проблемы с g_node_traverse, я просто не могу получить GNodeTraverseFunc правильно.Использование Gnome N-ary Trees в C++

Вы можете найти описание N-арной Дерево здесь: http://developer.gnome.org/glib/stable/glib-N-ary-Trees.html

я нашел несколько примеров в C, но я не мог управлять, чтобы перевести их правильно в C++ здесь:

http://www.ibm.com/developerworks/linux/tutorials/l-glib/section7.html

Пробовал последний фрагмент кода для n-арных деревьев.

Я ценю вашу помощь.

+0

Большинство этих функций должны быть простыми, так как я ничего не вижу о балансировке или вращении. какой из них вас смущает? –

+0

Из [FAQ] (http://stackoverflow.com/faq): Мы считаем, что в лучших вопросах переполнения стека есть немного исходного кода, но ваш вопрос должен в целом охватывать определенную проблему программирования (B) программный алгоритм (C) программный инструмент, обычно используемый программистами (D), практические, ответственные проблемы, которые уникальны для профессии программирования. Вы должны задавать только практические, ответные вопросы, основанные на реальных проблемах, с которыми вы сталкиваетесь. Ваши вопросы должны быть разумно охвачены. Если вы можете представить целую книгу, которая отвечает на ваш вопрос, вы слишком много спрашиваете. –

+0

Я действительно ничего не использовал бы в библиотеке Gnome N-arry в C++, API C не хорошо отображает C++ и должен быть полностью переработан с нуля. Зачем вам это нужно в C++? Что не так, просто добавив в ваш 'T *' класс 'std :: vector ? –

ответ

1

Ну, мне удалось запустить код. Проблема была в основном приложением, которое было необходимо, потому что Gnome использует gpointers, и мои данные должны храниться в структуре. Так что мой код:

gboolean iter(GNode* n, gpointer data) { 
    node s=*(node *)(n->data); 
    int ID=g_node_depth(n); 

    if (G_NODE_IS_ROOT(n)==true) 
    { 
     std::cout<<"Node "<<ID<<" is a Root"<<std::endl; 
    } 
    else if (G_NODE_IS_LEAF(n)==true) 
    { 
     std::cout<<"Node "<<ID<<" is a Leaf"<<std::endl; 
    } 

    std::cout<<"Speed of Node "<<ID<<" is: "<<s.v<<std::endl; 
    return FALSE; 
    } 

    int main(){ 

     node prueba,prueba1; 
     prueba.phi=0; 
     prueba.v=1; 
     prueba.x=50; 
     prueba.y=100; //Position in y 

     prueba1.phi=90; 
     prueba1.v=6; 
     prueba1.x=30; 
     prueba1.y=90; 

     GNode * root = g_node_new((gpointer) &prueba); 
     g_node_append(root, g_node_new((gpointer) &prueba1)); 

     g_node_traverse(root, G_PRE_ORDER, G_TRAVERSE_ALL, -1, iter, NULL); 

    return 0; 

    } 

Где моя структура является:

struct state { 
     double x; //Position in x of a car 
     double y; //Position in y " 
     double phi; //Yaw angle of a car 
     double v; //Speed of a car 
    }; 


    struct node { 
     double x; 
     double y; 
     double phi; 
     double v; 
     std::vector <state > trajectory; 
    }; 

Идея заключается в том, чтобы иметь всю предыдущую «траекторию», хранящуюся в каждом узле так, если я выбираю случайный узел/лист Я надеваю Не нужно восстанавливать траекторию, но просто возьмите ее.

Этот код работает сейчас. Это может быть улучшено, и я открыт для комментариев.

Надеюсь, это полезно для кого-то.

+0

Если вы используете API C напрямую, вы обязательно столкнетесь с неудобствами на C++ (такими как необходимые небезопасные приемы). Почему бы не использовать официальные привязки C++ (glibmm) вместо этого? [Там] (https://developer.gnome.org/glibmm/stable/classGlib_1_1NodeTree.html), дерево nary реализовано как класс шаблона, что должно облегчить вам задачу. – Ancurio

+0

@Ancurio Большое спасибо за подсказку! Я не знал, что была реализация для C++. У вас есть образец кода? – Altairtoral

+0

Это то, что я просто быстро нацарапал, глядя на документы: http: // pastebin.com/JNSpaaYu – Ancurio

Смежные вопросы