![]() |
![]() |
|
![]() |
![]() |
|
Programmierung Rat & Tat für Programmierer |
![]() |
|
Themen-Optionen | Ansicht |
![]() |
#1 |
Senior Member
![]() |
![]() Hallo Leute!
Ich schreibe ein Programm in C, dass Daten auf verschiedene Arten sortiert. Ich verwende für das Sortieren die Funktion gsort und die Vergleichsfunktionen schreibe ich selbst. Aber der Compiler (gcc) meldet mir einen Fehler im 4 Argument. Prototyp von qsort: void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); Aufruf: qsort(aData, MAX, sizeof(data_t *), compare); Die Funktion "compare" ist natürlich ordnungsgemäß deklariert. Weiß jemand wo der Fehler liegt? MfG Martin
____________________________________
Dank Computern können wir Probleme lösen die es vorher nicht gegeben hat! --- Nur ein Genie beherrscht das Chaos |
![]() |
![]() |
![]() |
#2 |
Veteran
![]() Registriert seit: 05.04.2002
Beiträge: 331
|
![]() wär vielleicht gut, wenn du den ganzen source + die exakte compiler fehlermeldung posten könntest.
____________________________________
Wenn es dumm ist aber funktioniert, ist es nicht dumm! |
![]() |
![]() |
![]() |
#3 |
Senior Member
![]() Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165
|
![]() Wenn ich mir den Prototypen
void qsort(void *base, size_t nmemb, size_t size, int (*compar)(const void *, const void *)); und das mit deinem Aufruf vergleiche: qsort(aData, MAX, sizeof(data_t *), compare); dann scheint es, dass es notwendig ist, dass du bei compare vergessen hast, zwei const void * (siehe prototyp) anzugeben. Schau mal in der Hilfe was das für Werte sein solln. PredeX PS: Ich hoffe ich habe mich verständlich ausgedrückt... ![]()
____________________________________
There are 10 types of people, those who understand binary and those who don\'t... Ask Me No Questions, And I Tell You No Lies! |
![]() |
![]() |
![]() |
#4 |
Senior Member
![]() |
![]() Hallo Leute!
@irrsinn fp.c:57: warning: passing arg 4 of `qsort' from incompatible pointer type @PredeX Die Funktion compare ist zb strcmp und bei Funktionszeiger darf ich meines Wissens ja keine Parameter angeben sonst wird der Compiler den Syntay eher als Funktionsaufruf interpretieren. Bsp: qsort(aData, MAX, sizeof(char *), strcmp); Die Werte können praktisch alles ein char *, int, double, Strukturen, ... . Das kommt auf die Funktion an. MfG Martin
____________________________________
Dank Computern können wir Probleme lösen die es vorher nicht gegeben hat! --- Nur ein Genie beherrscht das Chaos |
![]() |
![]() |
![]() |
#5 | ||
Senior Member
![]() Registriert seit: 03.09.2001
Alter: 41
Beiträge: 165
|
![]() also ich habe jetzt in meinem "schlauen buch" nachgesehen, und folgendes gefunden:
Zitat:
Code:
int compare( const void *p1, const void *p2) { if( *(int *)p1 > *(int *)p2 ) retrun (1); // ersetze (int *) durch den Datentypen den du bei deinem Array verwendest else if( *(int *)p1 < *(int *)p2 ) return (-1); // ersetze (int *) durch den Datentypen den du bei deinem Array verwendest else return (0); } Zitat:
PredeX
____________________________________
There are 10 types of people, those who understand binary and those who don\'t... Ask Me No Questions, And I Tell You No Lies! |
||
![]() |
![]() |
![]() |
#6 |
Senior Member
![]() |
![]() Hallo Leute!
@PredeX Das ist mir natürlich klar nur funktioniert anscheinend mein Syntax nicht. Denn wenn ich qsort mit einem 4 Paramter "strcmp" (Das ist eine Vergleichsfunktion die den von dir genannten Anforderungen entspricht) bekomme ich oben geposteten Fehler. Wie man die Funktion implementiert darf man schon selbst entscheiden ![]() zB qsort(aArray, MAX, sizeof(daten_typ), strcmp); aber anscheinend funktioniert, dass nicht so. Trotzdem Danke für deine Antwort. MfG Martin
____________________________________
Dank Computern können wir Probleme lösen die es vorher nicht gegeben hat! --- Nur ein Genie beherrscht das Chaos |
![]() |
![]() |
![]() |
#7 |
Jr. Member
![]() Registriert seit: 27.08.2001
Ort: Wien
Alter: 59
Beiträge: 84
|
![]() Der gcc compiler ist ganz schön schlau, er hat nämlich recht!
Der Visual C Compiler compiliert das dagegen ohne Murren (nur funkt. das Programm dann nicht) Der Fehler ist folgender: Ich nehme an, dein aArray ist ein Array von Strings, d.h. ein Pointer auf Pointer von chars! qsort 'füttert' die compare funktion mit pointern auf jeweils 2 Array-Einträge, in unserem Fall also char** und nicht char*, wie es der strcmp gern hätte!! Die Folge ist, dass so die Pointer im Array sortiert werden und nicht die Strings, sofern der strcmp da überhaupt mitspielt ![]() Abhilfe: Du musst doch eine eigene compare funktion schreiben, die so aussieht: int compare(const void *arg1, const void *arg2) { return strcmp(*((char**)arg1), *((char**)arg2)); } Damit sollte es dann funktionieren! lg. helmix |
![]() |
![]() |
![]() |
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1) | |
|
|