Frage

Einige Vorwort: Ich bin ein Computertechnik -Student, der nach 3 Semestern Java (bis zu Datenstrukturen) eine erste Klasse in C nimmt. Diese Frage bezieht sich auf eine Hausaufgabe, aber einige Schritte, die von der Lösung für mich entfernt wurden.

Ich habe eine Eingabedatei, die ich in den Speicher gelesen habe, so dass sie in char [9] [500] gespeichert ist. Ich habe höchstens 500 Saiten mit maximaler Länge 8 gelesen. Ich versuche, dieses Array mithilfe von STDLIB -integrierten in QSORT () -Funktion () zu sortieren, und habe einige Speicherfehler.

Wichtige Codeausschnitte:

char data[4][500][60];
char debug[500][9];
size_t count = 0;

/* initialize file, open for reading */
FILE* pUserlog;
pUserlog = fopen("userlog","r");

while(!feof(pUserlog))
{
    fscanf(pUserlog, "%9s %8s %16s",debug[count], data[1][count], data[2][count]);
    fgets(data[3][count], 60, pUserlog);
    count++;
}

In diesem Abschnitt wird die Daten in die Arrays angezeigt. Das Interesse an diesem Teil ist "Debug". Dies ist das oben angegebene Array. Hier ist meine Vergleichsfunktion für QSORT:

int compare(const void* a, const void* b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    puts("I'm in compare!");
    return strncmp(*ia, *ib,8);
}

Dies ist mein Versuch, QSORT zu nennen:

size_t debug_len = sizeof(debug)/sizeof(char*);
printf("debug len: %d, count: %d, sizeof(char*): %d\n",debug_len,count,sizeof(char*));
qsort(debug,count, sizeof(char *), compare);

Ich habe versucht, Debug_len in meinem Anruf zu ersetzen, wo die Grafschaft ist, aber ich bin immer noch segfaugt. Hier ist die Ausgabe:

$ ./test
debug len: 1125, count: 453, sizeof(char*): 4
I'm in compare!
Segmentation fault (core dumped)

Vielen Dank!

War es hilfreich?

Lösung

Die Vergleichsfunktion empfängt Zeiger auf die verglichenen Elemente. Sie versuchen effektiv, Zeichen mit Verwendung zu vergleichen strncmp(). Da Sie Zeiger auf jeden der Saiten haben, werfen Sie es an a char * und vergleichen.

int compare(const void* a, const void* b)
{
    const char *ia = (const char *)a;
    const char *ib = (const char *)b;
    puts("I'm in compare!");
    return strncmp(ia, ib, 9);
}

Denken Sie auch daran, dass es eine Reihe von Arrays ist, keine Reihe von Zeigern. Die Größe eines Elements sollte also die Größe des Arrays sein, 9 und nicht vom Zeiger, 4. Zu diesem Zeitpunkt wäre es einfacher, nur zu verwenden sizeof debug[0] Da es sich um ein zweidimensionales Array handelt. Wenn Sie dies nicht mit den richtigen Größen tun, qsort() Wird einfach dein Array zerstören.

size_t elemsize = sizeof debug[0];      /*   9 - size of each element */
size_t count = sizeof(debug)/elemsize;  /* 500 - number of elements in array */
qsort(debug, count, elemsize, compare);

Andere Tipps

Was hier passiert, ist: Sie haben 500 Saiten. Jetzt übergeben Sie alle 500 an QSORT, und es gibt wiederum jeden als ersten und zweiten Argument für Ihre Vergleichsfunktion. Es ist ein bisschen wie das Schreiben:

compare(debug[0], debug[1])

Der C -Compiler übergibt die Adressen, nicht die tatsächlichen Werte. Aber jetzt interpretieren Sie den Zeiger-auf-Void als Zeiger-zu-Zeiger-zu-Char-Char. Ihr Code macht jetzt eine Derreferenz beim Aufrufen strncmp, aber das macht das Wert (Die ersten 4 Bytes) werden als Zeiger in behandelt strncmp. Aber strncmp Versucht nun wiederum den Müll "Zeiger" (der aus einem Teil eines Ihrer Saiten besteht), und das macht macht Knall.

Verwenden Sie dies, um dies zu beheben char * Anstatt von char **:

int compare(const void* a, const void* b)
{
    puts("I'm in compare!");
    return strncmp((const char *)a, (const char *)b, 8);
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top