सी ++ - GDB त्रुटि प्रश्न

वोट
1

मैं सी में एक द्विआधारी खोज वृक्ष ++ पर काम कर रहा हूँ। मैं gdb चल मेरे कार्यक्रम पर (मैं एक segfault प्राप्त कर रहा हूँ) के बाद सूचना निम्न त्रुटियों हो रही है:

#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 त्रुटि मेरी getLeft () फ़ंक्शन, जो इस प्रकार है को संदर्भित करता है:

    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 त्रुटि मेरी ऑपरेटर ++ मेरी iterators में परिभाषित किया गया है, जो इस प्रकार है को संदर्भित करता है:

        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 त्रुटि, अपने मुख्य कार्यक्रम है, जहां मैं फ़ाइल कि tree_node के लिए मेरे निर्धारणों वाली शामिल कर रहा हूँ, binaryTree, bst_iter, और 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);
         }

मैं पूरी तरह यकीन है कि क्या त्रुटि पैदा नहीं कर रहा हूँ। मुझे विश्वास है कि ++ () एक क्षेत्र है कि परिभाषित नहीं किया गया उपयोग करने के लिए कोशिश कर रहा है, लेकिन मैं वास्तव में यकीन है कि क्यों यह है कि या कर कैसे इसे रोकने के लिए है नहीं कर रहा हूँ ... मैं कोड पर वापस पकड़ करने की कोशिश की, कोड के रूप में लगभग 800 लाइनों लंबा है, लेकिन अधिक जानकारी की आवश्यकता है, मुझे पता है ...

05/04/2011 को 02:32
का स्रोत उपयोगकर्ता
अन्य भाषाओं में...                            


3 जवाब

वोट
1

कैसे आप पाश इटरेटर मैं के लिए अपने आरंभ कर रहे हैं? यदि यह के साथ शुरू अमान्य है, तो है कि चीजें समझा जाएगा।

05/04/2011 को 02:36
का स्रोत उपयोगकर्ता

वोट
0

यह भी हो सकता है स्थिति _-> GetRight () एक अशक्त सूचक वापस लौट आता है।

जब से तुम अशक्त के लिए यह जाँच के बिना परिणाम पर getLeft बुला रहे हैं, तो आप एक इस सूचक है कि रिक्त है के साथ खत्म।

05/04/2011 को 02:46
का स्रोत उपयोगकर्ता

वोट
0

आप gdb वापस ट्रेस में देख सकते हैं, आपको बुला अंत getLeft()एक शून्य सूचक पर। यानी अपनी इस सूचक शून्य है।

अंदर अपने पाश में operator++, आप कॉल getLeft()पर pअगर यह शून्य है पहले की जाँच के बिना। यानी अगर getRight()रिटर्न शून्य, आप दुर्घटना होगा।

आप शायद इस तरह कुछ करना चाहता हूँ:

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

यह एक संपूर्ण सुधार हालांकि नहीं है। यह क्या अपने पर थोड़ा निर्भर करता है end()इटरेटर के राज्य माना जाता है।

हालांकि, ऐसा लगता है और अधिक कुशल देखते हैं और लागू करने की अधिक सहज ज्ञान युक्त तरीकों की तरह operator++। उदाहरण के लिए एसटीएल आप एक पेड़ में प्रविष्टियों और केवल अमान्य iterators उस नोड की ओर इशारा करते हटाना करने देता है। आपके मामले में, सभी iterators अवैध करना होगा।

05/04/2011 को 02:46
का स्रोत उपयोगकर्ता

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