2017-02-03 4 views
0

Ich bekomme Fehler in der Zeile, wo ich "<<--" (Zeile 9) Zeichen gesetzt. Es hatte keinen Kompilierungsfehler, aber während der Eingabe wird "Segmentation fault: 11" angezeigt. Ich weiß nicht, was schief gelaufen ist.Ich bekomme Segmentierung Fehler: 11

Eingang:

3 3 
1 1 1 
2 2 2 
3 1 5 

Der Code:

#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]); 
    } 
} 

jemand mir mit diesem helfen?

+0

Willkommen bei Stack Overflow. Bitte lesen Sie bald die [Über] und [Ask] Seiten. Haben Sie die im "a" und "b" enthaltenen Adressen im Vergleicher ausgedruckt? Warum nicht? Haben Sie versucht, einen Debugger mit einem Unterbrechungspunkt zu verwenden, der auf dem Komparator eingestellt ist? –

+0

Beachten Sie, dass Ihr Code Probleme mit der Eingabe hat, wenn die Anzahl der Elemente in jeder Zeile nicht 3 ist (wenn also die erste Zeile der Daten '10 4' enthält, wird Ihr Code nicht korrekt mit der Größe 4 umgehen). Das ist nicht sofort kritisch - Ihr Code stürzt anscheinend ab, wenn der zweite Parameter '3' ist. –

+0

Wenn Sie eine der' scanf() '-Familien von Funktionen aufrufen, überprüfen Sie immer den zurückgegebenen Wert (nicht die Parameterwerte) Die Operation war erfolgreich. – user3629249

Antwort

3

Ihr

int t[n][3]; 

Array ist eigentlich eine 1D-Array bestehend aus n 1D-Arrays vom Typ int [3]. Diese int [3] Objekte ist das, was Sie von Ihrem

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

Anruf zu sortieren versuchen.

Damit Sie diese Objekte richtig vergleichen können, müssen Sie die Parameter Ihres Vergleichs-Callbacks als Zeiger auf int [3] Objekte interpretieren. In der Zwischenzeit wird Ihre aktuelle Implementierung von comp geschrieben, als ob die Parameter auf int * Objekte zeigen, was falsch ist. int [3] und int * sind zwei sehr unterschiedliche Dinge.

Dies ist, wie Sie es

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 
} 

Alternativ tun können, können Sie den comp Prolog-Code als

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 
} 

Dies setzt voraus, schreiben kann, dass der Rest des Vergleichslogik korrekt ist. Beachten Sie jedoch, dass der Vergleich von int Werten durch Subtrahieren von ihnen riskant ist, da sie überlaufen kann.

+0

sir Ihre erste Lösung zeigt Fehler. "initialisiere 'int (*) [3]' mit einem Ausdruck vom Typ 'const void *' verwirft Qualifier [-Wincompatible-pointer-types-discards-qualifiers]" dieser Code funktioniert "int (* a) [3] = (int (*) [3]) x; int (* b) [3] = (int (*) [3]) y; " stattdessen –

Verwandte Themen