www.mikrocontroller.net

Forum: Compiler & IDEs qsort haut nicht hin


Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
int Compare(const void *a, const void *b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}

char entry[40][20];
char count=0;

while (nav_filelist_set(0, FS_FIND_NEXT))
{
     nav_file_getname(entry[count++], 40);
}
qsort(entry, count, sizeof(char *), Compare);

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So habe ich es jetzt, stürzt aber immer noch ab.
typedef char nameString[40];
nameString entry[20];
char count=0;


int Compare(const void *a, const void *b)
{
    const char **ia = (const char **)a;
    const char **ib = (const char **)b;
    return strcmp(*ia, *ib);
}


while (nav_filelist_set(0, FS_FIND_NEXT))
{
     nav_file_getname(entry[count++], 40);
}


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

Autor: Flo (Gast)
Datum:

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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael schrieb:
> So habe ich es jetzt, stürzt aber immer noch ab.

>     return strcmp(*ia, *ib);

und was machen die * da?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef char nameString[40];
nameString entry[20];

int Compare(const void *a, const void *b)
{
    nameString *ia = (nameString *)a;
    nameString *ib = (nameString *)b;

    return strcmp(ia, ib);
}

int main()
{
  int i;
  
  strcpy( entry[0], "string 3" );
  strcpy( entry[1], "string 1" );
  strcpy( entry[2], "String 3" );
  strcpy( entry[3], "abcd" );
  
  qsort(entry, 4, sizeof(nameString), Compare);

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

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt gehts, Besten Dank für die Hilfe.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.