मैं एक पेपर के लिए मेरे प्रोफेसर के लिए मास स्पेक्ट्रोमेट्री डेटाबेस पर काम कर रहा हूं। यह मेरी यहां पहली पोस्ट भी है, हालांकि साइट बहुत मददगार रही है।

मुझे झंडे के साथ GNU CPP 4.8 का उपयोग करते हुए निम्नलिखित त्रुटि मिल रही है:

CXX = g++
BOOSTDIR = /home/user/boost_1_60_0/ #Uses boost_1_60_0 lirary.
CXXFLAGS = -std=c++11 -g -ggdb -rdynamic -D_GLIBCXX_DEBUG -Wall -Wextra -I$(BOOSTDIR)
LDFLAGS = -L/home/user/boost_1_60_0/stage/lib -lboost_system -lboost_filesystem -lboost_iostreams

जिसके परिणामस्वरूप:

/usr/include/c++/4.8/bits/stl_algo.h:2438:error: elements in iterator range 
    [__first, __last) are not partitioned by the predicate __comp and value     
    __val.

Objects involved in the operation:
iterator "__first" @ 0x0x7ffd8a308c30 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIP11cache_tableNSt9__cxx19986vectorIS3_SaIS3_EEEEENSt7__debug6vectorIS3_S7_EEEE (mutable iterator);
  state = dereferenceable (start-of-sequence);
  references sequence with type `NSt7__debug6vectorI11cache_tableSaIS1_EEE' @ 0x0x7ffd8a308c30
}
iterator "__last" @ 0x0x7ffd8a308c60 {
type = N11__gnu_debug14_Safe_iteratorIN9__gnu_cxx17__normal_iteratorIP11cache_tableNSt9__cxx19986vectorIS3_SaIS3_EEEEENSt7__debug6vectorIS3_S7_EEEE (mutable iterator);
  state = past-the-end;
  references sequence with type `NSt7__debug6vectorI11cache_tableSaIS1_EEE' @ 0x0x7ffd8a308c60
}
Aborted (core dumped)

यहां प्रासंगिक विधि कॉल है:

void db::get_range(double mz_min, double mz_max, double rt_min, double rt_max, std::vector<dp> & ilist){    
    //Get valid rt ranges. //OPTIMIZE
    auto rt_low = std::lower_bound(tlist.begin(), tlist.end(), rt_min, rt_less_than());     
    //Iterate from low end until out of range or end of list.
    for(auto a = rt_low; (a != tlist.end() && (*(*a).begin()).rt_max < rt_max); a++){
        //Get valid mz ranges. //OPTIMIZE                       
        auto mz_low = std::lower_bound((*a).begin(), (*a).end(), mz_min, mz_less_than()); //This call is what is throwing the error.

        for(auto b = mz_low; (b != (*a).end() && (*(*a).rbegin()).mz_max < mz_max); b++){

            std::clock_t access_time = std::clock();
            (*b).get(mz_min, mz_max, rt_min, rt_max, ilist, access_time);
            tqueue.push(std::make_pair(&(*b), access_time));
            trim();
        }
    }
}

यहां कुछ सहायक कोड दिए गए हैं:

        //Comparator to check rt ranges.
        struct rt_less_than{
            bool operator()(std::vector<cache_table> & p, double s) const{ 
                return p[0].rt_max < s; 
            }
            bool operator()(double p, std::vector<cache_table> & s) const{ 
                return p < s[0].rt_max; 
            }
        };

        //Comparator to check mz ranges.
        struct mz_less_than{
            bool operator()(cache_table & p, double s) const{ 
                return p.mz_max < s; 
            }
            bool operator()(double p, cache_table & s) const{ 
                return p < s.mz_max; 
            }
        };

अब यह पूरी बात तब तक काम कर रही थी जब तक मुझे बहुत सारे कोड को रिफलेक्टर नहीं करना पड़ा। मैं सीपीपी के साथ सबसे अनुभवी नहीं हूं और यह त्रुटि ऐसा लगता है जैसे मैं फ़ंक्शन के लिए कुछ टेम्पलेट आवश्यकता को पूरा नहीं कर रहा हूं और फिर भी जब मैं mz_lower_than() ऑब्जेक्ट के अंदर कक्षा का नाम जांचता हूं तो यह ठीक प्रतीत होता है। कॉल के अंदर mz_lower_than() पर जाँच करने पर पाया गया कि यह इस परीक्षण सेट के लिए आकार 99 के वेक्टर पर लगभग 90 कॉल के बाद एक त्रुटि देगा।

इस त्रुटि को गुगल करने से पता चला है कि कुछ अन्य लोगों ने इसे देखा है लेकिन पहले 3 पृष्ठों के बाद ऐसा लगता है कि किसी के पास वास्तव में कोई जवाब नहीं था। मुझे लगता है कि यह एक बहुत ही सरलता से होने वाली एक विदेशी त्रुटि है, लेकिन मैं यह पता नहीं लगा सकता कि यह क्या होगा।

कार्यक्रम बहुत बड़ा है इसलिए मैंने केवल वही चिपकाया जो आपको यह बताने के लिए आवश्यक न्यूनतम मात्रा में कोड था कि क्या हो रहा है। यदि आवश्यक हो तो मैं निश्चित रूप से अधिक कोड पेस्ट कर सकता हूं।

क्या कोई यहां मेरी सहायता करेगा? धन्यवाद!

c++
0
mWellington 7 सितंबर 2016, 04:35
1
ऐसा लगता है कि विभाजन के लिए सरणी सख्त कमजोर क्रम में नहीं है, जैसा कि std::lower_bound द्वारा आवश्यक है।
 – 
Sam Varshavchik
7 सितंबर 2016, 04:36
1
अपना न्यूनतम प्रतिलिपि प्रस्तुत करने योग्य उदाहरण प्रस्तुत करें। एक एमसीवीई न केवल "न्यूनतम" है, बल्कि "पूर्ण" भी है। यदि आपके पास अभी तक एक नहीं है, तो आपने अभी तक डिबगिंग समाप्त नहीं की है! सैम शायद सही है; वे तुलनित्र मुझे संदिग्ध लगते हैं।
 – 
Lightness Races in Orbit
7 सितंबर 2016, 04:42
ठीक है टिप्पणियों के लिए धन्यवाद। मैं यह देखने के लिए कि क्या वह त्रुटि थी, मैं std::sort() के साथ एक जांच करूंगा।
 – 
mWellington
8 सितंबर 2016, 17:42

1 उत्तर

सबसे बढ़िया उत्तर

आप केवल lower_bound को उस क्रम पर चला सकते हैं, जो आपके तुलनात्मक फ़नकार में उपयोग किए गए समान मानदंड के अनुसार क्रमित हो। चूंकि आप अपने कोड में कोई sort नहीं दिखाते हैं, इसलिए मुझे यह मान लेना चाहिए कि आपका डेटा क्रमबद्ध नहीं है।

2
Mark Ransom 7 सितंबर 2016, 05:08
बहुत देर से उत्तर देने के लिए क्षमा करें। मेरा बुरा रूप। यह वास्तव में उत्तर था।
 – 
mWellington
10 जुलाई 2017, 18:02