003
27.02.2007, 14:02 Uhr
Baweg
|
Naja ich muss es mit void* machen. Der Prototyp der msort-Funktion ist mir so vorgegeben! Außerdem muss es in C sein! Also ich habs jetzt hinbekommen dass es mit ints läuft, aber mit floats läuft es leider nicht. Da man mit void* selbst ja nicht arbeiten kann hab ich dann immer an nen char* übergeben. Keine Ahnung ob das so richtig war. Und in den Vergleichsfunktionen hab ich dann auch char* als Übergabewerte. So funktionierte es dann mit ints richtig aber halt nicht mit floats.
Hier mal mein kompletter Code. Hoffe mir kann da jemand helfen....
C++: |
#include <stdio.h>
int int_compare(void *vp1, void *vp2); float flt(void *vp1, void *vp2); void msort(void* base, long number, long size, int (*cmp) (void*, void*));
int main(void) { float zahlen[] = {1.5,7.7,1.2,2.2,3.2,5.1,1.0,9.1,7.9}; int i; msort(zahlen,9,sizeof(float),flt); for(i=0;i<9;i++) { printf("%d => %f\n",i,zahlen[i]); } return 0; }
// Integers vergleichen int int_compare(char* vp1, char* vp2) { int temp1 = vp1[0]; int temp2 = vp2[0]; //printf("%d - %d\n",vp1[0],vp2[0]); return(*vp1 - *vp2); }
// Floats vergleichen float flt(char* vp1, char* vp2) { float temp1 = (float) vp1[0]; float temp2 = (float) vp2[0]; return(*vp1 - *vp2); }
void msort(void* base, long number, long size, int (*cmp) (void*, void*)) { if(number>1) { long g1 = number/2; long g2 = number-g1; char* feld1=NULL; char* feld2=NULL; int i; int i1=0; int i2=0;
char* charbase = (char*)base; // Speicherallokation feld1 = malloc(g1*size); feld2 = malloc(g2*size); // Feld in 2 Felder teilen for(i=0;i<g1;i++) { feld1[i*size] = charbase[i*size]; } for(i=0;i<g2;i++) { feld2[i*size] = charbase[(i + g1)*size]; } // rekursiver Aufruf von msort mit den geteilten Feldern msort(feld1,g1,size,cmp); msort(feld2,g2,size,cmp); // Zusammensetzen der geteilten Felder for(i = 0; i < (g1 + g2); i++) { if ( (i2 >= g2) || (i1 < g1 && ( cmp(&feld1[i1*size], &feld2[i2*size]) <= 0 ))) { // nehme aus Feld1 charbase[i*size] = feld1[i1*size]; i1++; } else { // nehme aus Feld2 charbase[i*size] = feld2[i2*size]; i2++; } }
// Speicherfreigabe free(feld1); free(feld2); } else { return; } }
|
Dieser Post wurde am 27.02.2007 um 14:03 Uhr von Baweg editiert. |