2010-03-14 14 views
5

शामिल बीईल्डिंगर सेगफॉल्ट मैं एसटीएल का उपयोग कर प्रोग्रामिंग मोती के कॉलम 15 में प्रोग्राम को फिर से बनाने की कोशिश कर रहा हूं। मैं एक स्ट्रिंग और इंडेक्स के वेक्टर का उपयोग कर एक प्रत्यय सरणी बनाने की कोशिश कर रहा हूं। मैं उन शब्दों की सूची रिकॉर्ड करता हूं जिन्हें मैंने इनपुट नामक स्ट्रिंग में पढ़ा है जो प्रोग्राम की शुरुआत में stdin से पढ़े गए शब्दों की सूची के रूप में कार्य करता है। जब तक मैं कोड के सॉर्टिंग हिस्से तक नहीं पहुंच जाता तब तक सब कुछ अपेक्षित काम करता है। मैं एसटीएल के सॉर्ट एल्गोरिदम का उपयोग करना चाहता हूं, लेकिन मैं पूरी तरह से एक सीजी गलती से परेशान हूं जो मुझे लगता है।एसटीएल सॉर्ट एल्गोरिदम

मेरे पास है:

vector<unsigned int> words; 

और वैश्विक चर

string input; 

मैं तुलना अपने कस्टम परिभाषित समारोह:

bool wordncompare(unsigned int f, unsigned int s) { 
    int n = 2; 

    while (((f < input.size()) && (s < input.size())) 
     && (input[f] == input[s])) { 
    if ((input[f] == ' ') && (--n == 0)) { 
     return false; 
    } 

    f++; 
    s++; 
    } 

    return true; 
} 

जब मैं कोड चलाएँ:

sort(words.begin(), words.end()); 

कार्यक्रम सुचारू रूप से बाहर निकलता है।

हालांकि, जब मैं कोड चलाएँ:

sort(words.begin(), words.end(), wordncompare); 

मैं एसटीएल भीतर गहरे एक segfault उत्पन्न करते हैं।

GDB वापस ट्रेस कोड इस तरह दिखता है:

#0 0x00007ffff7b79893 in std::string::size() const() from /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/libstdc++.so.6 
#1 0x0000000000400f3f in wordncompare (f=90, s=0) at text_gen2.cpp:40 
#2 0x000000000040188d in  std::__unguarded_linear_insert<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, unsigned int, bool (*)(unsigned int, unsigned int)> (__last=..., __val=90, __comp=0x400edc <wordncompare(unsigned int, unsigned int)>) 
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1735 
#3 0x00000000004018df in std::__unguarded_insertion_sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>) 
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1812 
#4 0x0000000000402562 in std::__final_insertion_sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>) 
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:1845 
#5 0x0000000000402c20 in std::sort<__gnu_cxx::__normal_iterator<unsigned int*, std::vector<unsigned int, std::allocator<unsigned int> > >, bool (*)(unsigned int, unsigned int)> (__first=..., __last=..., __comp=0x400edc <wordncompare(unsigned int, unsigned int)>) 
at /usr/lib/gcc/x86_64-pc-linux-gnu/4.3.4/include/g++-v4/bits/stl_algo.h:4822 
#6 0x00000000004012d2 in main (argc=1, args=0x7fffffffe0b8) at text_gen2.cpp:70 

मैं अन्य प्रोग्राम में समान कोड है, लेकिन है कि कार्यक्रम में मैं एक सदिश का उपयोग कर रहा वेक्टर के बजाय। मेरे जीवन के लिए मैं यह नहीं समझ सकता कि मैं क्या गलत कर रहा हूं। धन्यवाद!

+0

इनपुट चर क्या है? –

+0

क्षमा करें। मैंने अभी और अधिक स्पष्टीकरण प्रदान करने के लिए अपना प्रश्न अपडेट किया है। –

+1

'के' चर क्या है? –

उत्तर

10

अधिकतर आपके तुलनित्र सख्त कमजोर आदेश को पूरा नहीं करते हैं; उदाहरण के लिए, यह पारगमनशीलता का उल्लंघन करता है क्योंकि मूल्यों की कुछ अंगूठी मौजूद होती है जैसे < बी, बी < सी, और सी < ए। यहां requirements हैं। मैं इसे अपने सिर के ऊपर से नहीं देखता, लेकिन मैं कुछ मिनटों के लिए इस पर घूरने जा रहा हूं।

+0

धन्यवाद! मैंने "वापसी (इनपुट [एफ] <इनपुट [एस]) के साथ" वापसी सत्य "को बदल दिया। सभी बेहतर। यह मुझे थक गया है जब मैं प्रोग्राम के लिए सिखाऊंगा! –

+0

हाँ, ऐसा लगता है कि यह एक समस्या होगी। लेकिन ऐसा लगता है जैसे एफ या एस इनपुट.size() के बराबर होता है? यह लूप से कौन सा हो सकता है? मुझे कोड के बाद परेशानी हो रही है (सुनिश्चित नहीं है कि क्या है?), तो यह है मुझे मिल गया। –

+0

मैं भी इस तरह एक दुर्घटना में भाग गया और फिक्स वापसी से तुलनात्मक तुलना में तुलना में तुलना करना था (numPixels1> = numPixels2) वापस करने के लिए (numPixels1> numPixels2)। – MoDJ

संबंधित मुद्दे