2009-10-09 21 views
11

En este código, para el tamaño del vector, n> = 32767, da error de segmentación, pero hasta 32766, funciona bien. ¿Cuál podría ser el error? Este es el código completo.función de ordenación C++ falla de segmentación

#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

¿Qué compilador y sistema operativo está utilizando? Tal vez simplemente no tiene suficiente memoria? – maykeye

+0

Recopilé una versión ligeramente modificada (no quería ingresar 35000 números desde la consola :-)) y funcionó bien con VS2008. Supongo que el problema está en otro lado. Publique el código con el cual el problema es reproducible. – Naveen

+0

Su GNU g ++ con cygwin ejecutándose en netbeans. Estoy usando freopen y tomando entrada del archivo. – avd

Respuesta

38

Esto puede estar relacionado con el fallo de segmentación, pero ...

En C++, el predicado "comparar" debe ser un strict weak ordering. En particular, "compare (X, X)" debe devolver "falso" para cualquier X. En su función de comparación, si ambos pares son idénticos, se aplica la prueba (p1.first <= p2.first), y se devuelve "verdadero". Por lo tanto, este predicado de "comparación" no impone un orden débil estricto, y el resultado de pasarlo a "ordenar" no está definido.

+0

Señor: ¿Eso significa que C++ verifica implícitamente que si dos objetos son iguales, debería devolver falso. Pero por qué estaba funcionando para n <= 32766. Señor: eres grandioso. Me has ayudado nuevamente a resolver un problema. – avd

+1

Sin verificación implícita deliberada: solo un algoritmo de ordenación confuso. Diferente entrada => diferente confundido. – Steve314

+2

+1 - muy bien visto! @aditya: Recuerde que las funciones de comparación STL se preguntan "es el primero menos que el segundo", no "son iguales". – Smashery

3

Trate de usar todos los valores de n = 32766 hasta 32770. Sospecho que descubrirá que está experimentando algún tipo de desbordamiento. Esto se debe a que 2^15 (32768) es el número más grande que puede representarse utilizando 16 bits (suponiendo que también permita números negativos). Deberá usar un tipo de datos diferente.

Sugerencia:

conseguir que la salida maxsize del vector:

cout << p.max_size(); 

vamos a saber lo que hace. Como todo es normal, espero que sea de cientos de millones (536870911 en mi computadora). Pero si se parece más a 32768, ese podría ser el problema.

+0

¿Cómo podría haber desbordamiento? Solo estoy comparando. No se realiza aritmética aquí. – avd

+0

¿Tal vez su compilador está configurando int a 16 bits? –

+0

Estoy seguro de que en mi sistema, int es de 32 bits. Lo he comprobado – avd

Cuestiones relacionadas