qsort haut nicht hin

Gast #1618061
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);
#1618066
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.
Gast #1618122
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);
#1618152
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren