2009-10-09 13 views
11

इस कोड में, वेक्टर आकार के लिए, n> = 32767, यह सेगमेंटेशन गलती देता है, लेकिन 32766 तक, यह ठीक चलता है। त्रुटि क्या हो सकती है? यह पूरा कोड है।सॉर्ट फ़ंक्शन सी ++ सेगमेंटेशन गलती

#include<cstdio> 
#include<cstring> 
#include<cmath> 
#include<queue> 
#include<utility> 
#include<algorithm> 
#include<sys/time.h> 
using namespace std; 
#define MAX 100000 

bool compare(pair<int,int> p1,pair<int,int> p2) { 
    if(p1.second < p2.second) 
     return 1; 
    else if(p1.second > p2.second) 
     return 0; 
    if(p1.first <= p2.first) 
     return 1; 
    else 
     return 0; 
} 

int main() { 
    freopen("randomin.txt","r",stdin); 
    int n; 
    scanf("%d",&n); 
    vector< pair<int,int> > p(n); 
    for(int i=0;i<n;i++) 
     scanf("%d%d",&p[i].first,&p[i].second); 
    **printf("%d\n",(int)p.max_size()); // prints 536870911** 
    sort(p.begin(),p.begin()+n,compare); 

    //for(int i=0;i<n;i++) 
     //printf("%d %d\n",p[i].first,p[i].second); 
     printf("%.6f\n",(p[n-1].second+p[n-2].second)/(20.0+p[n-1].first+p[n-2].first)); 

    return 0; 
} 
+0

आप किस कंपाइलर और ओएस का उपयोग कर रहे हैं? शायद इसमें पर्याप्त स्मृति नहीं है? – maykeye

+0

मैंने थोड़ा संशोधित संस्करण संकलित किया (मैं कंसोल से 35000 नंबर दर्ज नहीं करना चाहता था :-)) और यह VS2008 का उपयोग करके ठीक चला गया। मुझे लगता है कि समस्या कहीं और है। उस कोड को पोस्ट करें जिसके साथ समस्या पुन: उत्पन्न होती है। – Naveen

+0

नेटबीन पर चल रहे सिग्विन के साथ इसका जीएनयू जी ++। मैं फ्रीपेन का उपयोग कर रहा हूं और फाइल से इनपुट ले रहा हूं। – avd

उत्तर

38

यह आपके विभाजन गलती से संबंधित नहीं हो सकता है, लेकिन ...

सी ++, आपके "की तुलना" विधेय एक strict weak ordering होना चाहिए। विशेष रूप से, "तुलना करें (एक्स, एक्स)" किसी भी एक्स के लिए "झूठा" वापस करना होगा। आपके तुलनात्मक कार्य में, यदि दोनों जोड़े समान हैं, तो आपने परीक्षण (p1.first <= p2.first) पर परीक्षण किया, और "सत्य" वापस कर दिया। इसलिए, यह "तुलना" भविष्यवाणी सख्त कमजोर आदेश नहीं लगाती है, और इसे "सॉर्ट" करने के परिणाम को अपरिभाषित किया जाता है।

+0

सर के बारे में बहुत अजीब बात है: क्या इसका मतलब यह है कि सी ++ स्पष्ट रूप से जांचता है कि यदि दो वस्तुएं समान हैं, तो इसे झूठी वापसी करनी चाहिए। लेकिन यह एन <= 32766 के लिए क्यों काम कर रहा था। महोदय: आप बहुत अच्छे हैं। आपने फिर से मुझे समस्या हल करने में मदद की है। – avd

+1

कोई जानबूझकर निहित जांच - केवल एक भ्रमित प्रकार एल्गोरिदम। अलग इनपुट => अलग उलझन में। – Steve314

+2

+1 - अच्छी तरह से देखा! @aditya: याद रखें कि एसटीएल तुलना कार्यों से पूछ रहे हैं "पहले से कम पहला है" - नहीं "वे बराबर हैं"। – Smashery

3

32770 अप करने के लिए n = 32766 से सभी मूल्यों का उपयोग करें। मुझे संदेह है कि आप पाएंगे कि आप किसी प्रकार का अतिप्रवाह अनुभव कर रहे हैं। ऐसा इसलिए है क्योंकि 2^15 (32768) सबसे बड़ी संख्या है जिसे 16 बिट्स का उपयोग करके दर्शाया जा सकता है (माना जाता है कि आप नकारात्मक संख्या भी देते हैं)। आपको एक अलग डेटा प्रकार का उपयोग करना होगा।

सुझाव:

उत्पादन वेक्टर के MAXSIZE करने के लिए इसे प्राप्त करें:

cout << p.max_size(); 

हमें पता है कि क्या करता हूँ। सभी चीजें सामान्य हैं, मैं उम्मीद करता हूं कि यह सैकड़ों लाखों (मेरे कंप्यूटर पर 536870 9 11) में होगा। लेकिन अगर यह 32768 की तरह है, तो यह समस्या हो सकती है।

+0

ओवरफ्लो कैसे हो सकता है? मैं बस तुलना कर रहा हूँ। यहां कोई अंकगणित नहीं किया जा रहा है। – avd

+0

शायद आपका कंपाइलर 16 बिट्स को int सेट कर रहा है? –

+0

मुझे यकीन है कि मेरे सिस्टम पर, int 32 बिट्स है। मैंने इसे – avd

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