C ++ - GDB hata Soru

oy
1

Ben C bir ikili arama Ağacı ++ üzerinde çalışıyorum. Benim program üzerinde (Ben segfault alıyorum) gdb çalıştırdıktan sonra bildirilen aşağıdaki hataları alıyorum:

#0  0x08049058 in searchTree::tree_node<int>::getLeft (this=0x0) at bst.hxx:75
#1  0x08048ed8 in searchTree::bst_iter<int>::operator++ (this=0xbffff4b4) at bst.hxx:586
#2  0x08048a72 in main () at projectmain.cxx:29

# 0 hatası aşağıdaki gibidir benim Getleft () işlevi, ifade eder:

    template <typename T>
    inline tree_node<T>* tree_node<T>::getLeft() const
    {
        return tree_node<T>::left_; //note that left_ is of type tree_node<T>*
    }

1. hata aşağıdaki gibidir benim yineleyicileri tanımlanan zaman operatör ++ belirtir:

        bst_iter<T>& operator++()
        { //note that s is a stack of tree_node<T>*
            tree_node<T> *p = pos_->getRight();
            s.push(p);
            for(p=p->getLeft(); p!=NULL; p=p->getLeft())
            {
                s.push(p);
            }
            pos_ = s.top();
            s.pop();
            return *this;
        }

2. Hata İçinde tree_node benim tanımlarını içeren dosya dahil ediyorum, benim ana programa atıfta (bu noktada mevcut değil, yani değil bir sorun) BinaryTree, bst_iter ve bst_citer.

                            bst_iter<int> i = treeTime.begin(); //treeTime is our tree
            bst_iter<int> iEnd = treeTime.end();
                            for(; i != iEnd ;++i) //crash
            {
                cout<<*i<< ;
            }

        template <typename T>
        inline bst_iter<T> binaryTree<T>::begin()
         {

             return bst_iter<T>(root_);
         }

        template <typename T>
        inline bst_iter<T> binaryTree<T>::end()
         {
            return bst_iter<T>(0);
         }

Ben hataya neden ne tamamen emin değilim. Ben ++ () tanımlanmadığı bir alanı erişmeye çalışıyor inanıyoruz, ama bunu yaparken veya nasıl durdurulacağını neden gerçekten emin değilim ... Ben kodu olarak, kod üzerinde geri tutmaya çalıştı neredeyse 800 satır uzunluğundadır, ancak daha fazla bilgi gerekirse, bana bildirin ...

Oluştur 05/04/2011 saat 02:32
kaynak kullanıcı
Diğer dillerde...                            


3 cevaplar

oy
1

Nasıl döngü yineleyici i için lütfen başlatılıyor? ile başlamak geçersiz ise, o şeyleri açıklıyor.

Cevap 05/04/2011 saat 02:36
kaynak kullanıcı

oy
0

pos _-> getright () bir boş gösterici döndürür bu durum ortaya çıkabilir.

Eğer boş olup olmadığını kontrol etmeden sonucu Getleft çağıran olduğundan, null bir bu pointer ile bitirmek.

Cevap 05/04/2011 saat 02:46
kaynak kullanıcı

oy
0

Eğer gdb arka iz görebileceğiniz gibi, aradığınız sona getLeft()bir NULL işaretçi. yani, bu işaretçi NULL.

Iç döngü içinde operator++, aramak getLeft()üzerinde pNULL ise kontrol etmeden. yani eğer getRight()döner NULL, o zaman kaza gerekir.

Muhtemelen böyle bir şey yapmak istiyorum:

bst_iter<T>& operator++()
    { //note that s is a stack of tree_node<T>*
        tree_node<T> *p = pos_->getRight();
        if (p == NULL) p = pos_;
        else s.push(p);
        for(p=p->getLeft(); p!=NULL; p=p->getLeft())
        {
            s.push(p);
        }
        // TODO: what if s is empty?
        pos_ = s.top();
        s.pop();
        return *this;
    }

Gerçi tam bir düzeltme değil. Bu sizin ne biraz bağlıdır end()yineleyici devlet olması gerekiyordu.

Orada daha verimli ve uygulanması daha sezgisel yollar gibi Ancak, öyle görünüyor operator++. Örneğin STL o düğüme işaret eden bir ağaçta girişlerini ve tek geçersiz yineleyicinızı silmenize izin verir. Senin durumda, tüm yineleyiciler geçersiz olurdu.

Cevap 05/04/2011 saat 02:46
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more