2009-10-09 7 views
11

このコードでは、ベクトルサイズn> = 32767の場合、セグメンテーションフォールトが発生しますが、32766までは正常に実行されます。何が原因なのですか?これは完全なコードです。ソート関数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

使用しているコンパイラとOSは?たぶん、十分な記憶がないでしょうか? – maykeye

+0

少し修正したバージョンをコンパイルしました(私はコンソールから35000の数字を入力したくありませんでした:-))、VS2008を使ってうまく動作しました。私は問題が別の場所にあると思う。問題が再現可能なコードを掲載してください。 – Naveen

+0

GNU g ++とnetbeansで動作するcygwin。私はfreopenを使用しており、ファイルから入力を受け取ります。 – avd

答えて

38

、あなたの「比較」述語はstrict weak orderingでなければなりません。特に、 "compare(X、X)" は任意のXに対して "false"を返す必要があります。比較関数では、両方のペアが同じ場合は、テスト(p1.first <= p2.first)を返し、 "true"を返します。したがって、この「比較」述語は厳密な弱い順序を課すものではなく、「ソート」に渡す結果は未定義です。

+0

Sir:これは、C++が2つのオブジェクトが同じであればfalseを返さなければならないことを暗黙にチェックするのでしょうか?しかしなぜそれがn <= 32766のために働いていた。サー:うーん、素晴らしい。あなたは再び問題を解決するのを手伝ってくれました。 – avd

+1

意図的な暗黙的なチェックはありません。ちょうど混乱したソートアルゴリズムです。異なった入力=>異なった混乱。 – Steve314

+2

+1 - きれいに見つかった! @aditya:STLの比較機能は、「最初のものは2番目のものよりも小さい」と尋ねています。 – Smashery

3

32770までn = 32766からすべての値を使用してみてください。私はあなたが何らかのオーバーフローを経験していることがわかるでしょう。これは、2^15(32768)が16ビットを使用して表現できる最大の数であるためです(負の数も許可すると仮定して)。別のデータ型を使用する必要があります。

提案:

出力ベクトルのMAXSIZEにそれを取得します。

cout << p.max_size(); 

は、私たちはそれが何をするか知ってみましょう。すべての事が正常で、私はそれが何億というものになると思います(コンピュータ上の536870911)。しかしそれが32768のようなものであれば、それが問題になる可能性があります。これはC++で

あなたのセグメンテーションフォールトとは無関係な、しかし...かもしれ

+0

どのようにオーバーフローが発生する可能性がありますか?私はちょうど比較しています。ここで算術演算は行われません。 – avd

+0

あなたのコンパイラはintを16ビットに設定していますか? –

+0

私のシステムでは、intは32ビットであると確信しています。私はそれをチェックしました – avd

関連する問題