2017-02-03 6 views
0

"<<--"(行9)と書いた行にエラーが表示されます。コンパイルエラーはありませんでしたが、入力中に "Segmentation fault:11"と表示されました。私は何がうまくいかなかったのか分からない。セグメンテーションフォールトが発生しています:11

入力:

3 3 
1 1 1 
2 2 2 
3 1 5 

コード:

#include <stdio.h> 
#include <stdlib.h> 

int comp (const void * x, const void * y) 
{ 
    int *a = *(int **)x; 
    int *b = *(int **)y; 

    //getting error here 

    if (a[0] == b[0]) // <<-- here 
    { 
     if (a[2] == b[2]) 
     { 
      return -(a[1] - b[1]); 
     } 
     else 
     { 
      return a[2] - b[2]; 
     } 
    } 
    else 
    { 
     return a[0] - b[0]; 
    } 
} 

int main() 
{ 
    int n; 
    long long d; 
    scanf("%d %lld", &n, &d); 

    int t[n][3]; 
    for (int i = 0; i < n; i++) 
    { 
     scanf ("%d %d %d", &t[i][0], &t[i][1], &t[i][2]); 
    } 

    printf("%lu\n", sizeof(t[0])); 
    qsort(t, n, sizeof(t[0]), comp); 

    for (int i = 0; i < n; ++i) 
    { 
     printf("%d-%d-%d\n", t[i][0], t[i][1], t[i][2]); 
    } 
} 

誰もこれで私を助けることができますか?

+0

ようこそスタックオーバーフロー。まもなく、[About]と[Ask]ページをお読みください。コンパイラに 'a'と' b'のアドレスを出力しましたか?何故なの?コンパレータにブレークポイントを設定してデバッガを試してみましたか? –

+0

コードには、各行の要素数が3ではない入力に関する問題があることに注意してください(データの最初の行に '10 4 'が含まれる場合、コードはサイズ4を正しく処理しません)。それはすぐには重要ではありません - 第2引数が '3' –

+0

のとき、あなたのコードはクラッシュしているようですが、' scanf() 'ファンクションファミリを呼び出すときは常に、返される値(パラメータ値ではありません)操作は成功しました。 – user3629249

答えて

3

あなた

int t[n][3]; 

アレイは、実際にタイプint [3]n 1Dアレイからなる1次元アレイです。これらのint [3]オブジェクトは、あなたが並べ替えようとしているものです

qsort(t, n, sizeof(t[0]), comp) 

コールです。

これらのオブジェクトを適切に比較するには、比較コールバックのパラメータをint [3]オブジェクトへのポインタとして解釈する必要があります。一方、現在のcompの実装は、パラメータがint *オブジェクトを指しているかのように記述されていますが、これは間違っています。 int [3]int *は2つの非常に異なるものです。

これは、あなたがそれを行うことができますどのように

int comp (const void * x, const void * y) 
{ 
    int (*a)[3] = x; 
    int (*b)[3] = y; 

    // And now compare the arrays by accessing them as `(*a)[1]`, 
    // `(*b)[2]` and so on 
} 

また、あなたが

int comp (const void * x, const void * y) 
{ 
    const int *a = *(int (*)[3]) x; 
    const int *b = *(int (*)[3]) y; 

    // And now compare the arrays by accessing them as `a[1]`, 
    // `b[2]` and so on, i.e. keep the rest of your code unchanged 
} 

としてcompプロローグコードを書くことができます。これは、あなたの比較ロジックの残りの部分が正しいことを前提としています。ただし、それらを互いに引き算してintの値を比較すると、オーバーフローする可能性があるため、危険です。

+0

あなたの最初の解決策がエラーを表示しています。 "const void * '型の式を持つ' int(*)[3] 'を初期化すると修飾子が破棄されます [-Wincompatible-pointer-types-discards-qualifiers]" this code works "int(* a)[3] = (int(*)[3])); x; int(* b)[3] =(int(*)[3])y;代わりに –

関連する問題