qsort haut nicht hin

Gast #1618061
Hallo,

ich möchte ein array sortieren, habe jedoch einen Fehler.
Das Programm stürzt ab, sicher sieht den Fehler gleich jemand und kann 
mir helfen.

Es sind 3 Einträge zu sortieren.
1
int Compare(const void *a, const void *b)
2
{
3
    const char **ia = (const char **)a;
4
    const char **ib = (const char **)b;
5
    return strcmp(*ia, *ib);
6
}
7

8
char entry[40][20];
9
char count=0;
10

11
while (nav_filelist_set(0, FS_FIND_NEXT))
12
{
13
     nav_file_getname(entry[count++], 40);
14
}
15
qsort(entry, count, sizeof(char *), Compare);
#1618066
Michael schrieb:

> qsort(entry, count, sizeof(char *), Compare);


Ein "Element" deines Arrays hat nicht die Größe sizeof(char*)

Mach dir das am besten so klar

Du hast einen 'Spezialstring' der 19 (20 mit \0) Zeichen aufnehmen kann

typedef char[20] nameString;

von diesem Datentyp nameString, willst du ein Array haben, welches 40 
solcher 'Strings' bündelt

nameString entry[40];


Der qsort Aufruf muss dann so aussehen

  qsort( entry, count, sizeof( nameString ), Compare );

denn ein Element im entry Array hat ja die Größe eines nameString. 
sizeof(nameString) ist aber 20 und nicht sizeof(char*)

Und deine Compare Funktion kriegt dann Pointer auf nameString Objekte 
zum Vergleich zugeschanzt.
Gast #1618122
So habe ich es jetzt, stürzt aber immer noch ab.
1
typedef char nameString[40];
2
nameString entry[20];
3
char count=0;
4

5

6
int Compare(const void *a, const void *b)
7
{
8
    const char **ia = (const char **)a;
9
    const char **ib = (const char **)b;
10
    return strcmp(*ia, *ib);
11
}
12

13

14
while (nav_filelist_set(0, FS_FIND_NEXT))
15
{
16
     nav_file_getname(entry[count++], 40);
17
}
18

19

20
qsort(entry, count, sizeof(nameString), Compare);
#1618152
Michael schrieb:
> So habe ich es jetzt, stürzt aber immer noch ab.

>     return strcmp(*ia, *ib);

und was machen die * da?

1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <string.h>
4

5
typedef char nameString[40];
6
nameString entry[20];
7

8
int Compare(const void *a, const void *b)
9
{
10
    nameString *ia = (nameString *)a;
11
    nameString *ib = (nameString *)b;
12

13
    return strcmp(ia, ib);
14
}
15

16
int main()
17
{
18
  int i;
19
  
20
  strcpy( entry[0], "string 3" );
21
  strcpy( entry[1], "string 1" );
22
  strcpy( entry[2], "String 3" );
23
  strcpy( entry[3], "abcd" );
24
  
25
  qsort(entry, 4, sizeof(nameString), Compare);
26

27
  for( i = 0; i < 4; ++i )
28
    printf( "%s\n", entry[i] );
29
}

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.