2009-10-09 19 views
11

W tym kodzie, dla wielkości wektora, n> = 32767, daje błąd segmentacji, ale do 32766, działa dobrze. Jaki może być błąd? To jest pełny kod.funkcja sortowania C++ błąd segmentacji

#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

Jakiego kompilatora i systemu operacyjnego używasz? Może po prostu nie ma wystarczająco dużo pamięci? – maykeye

+0

Skompilowałem nieco zmodyfikowaną wersję (nie chciałem wprowadzić 35000 numerów z konsoli :-)) i działało dobrze przy użyciu VS2008. Myślę, że problem jest gdzie indziej. Opublikuj kod, z którym problem jest odtwarzalny. – Naveen

+0

Jego GNU g ++ z cygwin działającym na netbeans. Używam freopen i pobieranie danych z pliku. – avd

Odpowiedz

38

Może to być związane z twojej winy segmentacji, ale ...

W C++, swoją "Porównaj" orzeczenie musi być strict weak ordering. W szczególności "compare (X, X)" musi zwracać "false" dla dowolnego X. W twojej funkcji porównania, jeśli obie pary są identyczne, trafisz w test (p1.first <= p2.first) i zwrócisz "true". Dlatego ten "porównawczy" predykat nie narzuca ścisłej słabej kolejności, a wynik przejścia do "sortowania" jest niezdefiniowany.

+0

Sir: Czy to oznacza, że ​​C++ sprawdza niejawnie, że jeśli dwa obiekty są takie same, powinien zwrócić wartość false. Ale dlaczego działało dla n <= 32766. Sir: jesteś świetny. Ponownie pomógł mi rozwiązać problem. – avd

+1

Brak świadomego, niejawnego sprawdzenia - po prostu algorytm zagmatwany. Różne dane wejściowe => różnie zdezorientowane. – Steve314

+2

+1 - ładnie nakrapiane! @aditya: Pamiętaj, że funkcje porównywania STL pytają "to pierwszy mniej niż drugi" - nie "są równi". – Smashery

3

Wypróbuj wszystkie wartości z n = 32766 do 32770. Podejrzewam, że odkryjesz, że doświadczasz jakiejś przepełnienia. Dzieje się tak dlatego, że 2^15 (32768) to największa liczba, którą można przedstawić za pomocą 16 bitów (zakładając, że dozwolone są również liczby ujemne). Będziesz musiał użyć innego rodzaju danych.

Sugestia:

Pobierz go do wyjścia MAXSIZE nosiciela:

cout << p.max_size(); 

Daj nam znać, co to robi. Wszystkie rzeczy są normalne, spodziewam się, że będzie to setki milionów (536870911 na moim komputerze). Ale jeśli jest bardziej jak 32768, to może być problem.

+0

Jak może wystąpić przepełnienie? Po prostu się porównuję. Nie ma tu żadnej arytmetyki. – avd

+0

Może twój kompilator ustawia int na 16 bitów? –

+0

Jestem pewien, że w moim systemie int wynosi 32 bity. Sprawdziłem to. – avd

Powiązane problemy