0

私はglibを使用してc++でN-aryツリーを実装しようとしていますが、私はc ++の専門家ではないため、正しく使用する方法を見つけるのに問題があります。基本的な機能の使い方を理解するのに役立つ、C ++で書かれた簡単な例を持っている人はいますか?g_node_traverseで特別な問題が発生していますが、GNodeTraverseFuncを正しく取得できません。

N-aryツリーの説明はここにあります: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-aryツリーの最後のコードを試してみました。

私はあなたの助けに感謝します。

4

1 に答える 1

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;
    };

アイデアは、以前の「軌跡」全体を各ノードに保存することです。そのため、ランダムなノード/リーフを選択した場合、軌跡を再構築する必要はなく、それを取るだけです。

このコードは現在動作します。それは改善される可能性があり、私はどんなコメントも受け付けています。

誰かに役立つことを願っています。

于 2013-03-11T10:22:04.217 に答える