2009-10-09 27 views
11

In questo codice, per dimensione vettoriale, n> = 32767, fornisce un errore di segmentazione, ma fino a 32766, funziona correttamente. Quale potrebbe essere l'errore? Questo è il codice completo.Errore di segmentazione C++

#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

Quale compilatore e sistema operativo si sta utilizzando? Forse non ha abbastanza memoria? – maykeye

+0

Ho compilato una versione leggermente modificata (non volevo inserire 35000 numeri dalla console :-)) e funzionava bene con VS2008. Immagino che il problema sia da un'altra parte. Pubblica il codice con il quale il problema è riproducibile. – Naveen

+0

GNU g ++ con cygwin in esecuzione su netbeans. Sto usando freopen e prendendo input dal file. – avd

risposta

38

Questo può essere correlato al vostro errore di segmentazione, ma ...

In C++, il vostro predicato "confrontare" deve essere un strict weak ordering. In particolare, "compare (X, X)" deve restituire "false" per qualsiasi X. Nella funzione di confronto, se entrambe le coppie sono identiche, si preme il test (p1.first <= p2.first) e si restituisce "true". Pertanto, questo predicato "confronta" non impone un rigoroso ordinamento debole e il risultato del suo passaggio a "ordinamento" non è definito.

+0

Sir: Significa che quel C++ controlla implicitamente che se due oggetti sono uguali, dovrebbe restituire false. Ma perché stava funzionando per n <= 32766. Signore: sei fantastico. Mi hai di nuovo aiutato a risolvere un problema. – avd

+1

Nessun controllo implicito deliberato - solo un algoritmo di ordinamento confuso. Input diverso => ​​diversamente confuso. – Steve314

+2

+1 - ben individuato! @aditya: Ricorda che le funzioni di confronto STL stanno chiedendo "è il primo meno del secondo" - non "sono uguali". – Smashery

3

Prova utilizzando tutti i valori da n = 32766 fino a 32770. Sospetto che scoprirai che stai vivendo una sorta di overflow. Questo perché 2^15 (32768) è il numero più grande che può essere rappresentato utilizzando 16 bit (ammesso che si consentano anche numeri negativi). Dovrai utilizzare un tipo di dati diverso.

Suggerimento:

garantita per l'output maxsize del vettore:

cout << p.max_size(); 

farci sapere cosa fa. Essendo tutto normale, mi aspetterei che fosse tra centinaia di milioni (536870911 sul mio computer). Ma se è più come 32768, allora quello potrebbe essere il problema.

+0

Come potrebbe esserci un overflow? Sto solo confrontando. Non ci sono aritmetici eseguiti qui. – avd

+0

Forse il tuo compilatore sta impostando int a 16 bit? –

+0

Sono sicuro che sul mio sistema, int è a 32 bit. L'ho controllato – avd