Forum: Compiler & IDEs qsort haut nicht hin


von Michael (Gast)


Lesenswert?

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);

von Karl H. (kbuchegg)


Lesenswert?

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.

von Michael (Gast)


Lesenswert?

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);

von Flo (Gast)


Lesenswert?

fehlen beim Compare im qsort-Aufruf nicht noch die Parameter?

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Michael (Gast)


Lesenswert?

Jetzt gehts, Besten Dank für die Hilfe.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.