Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit void-Pointer!

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
26.02.2007, 21:07 Uhr
Baweg



Ich muss einen Merge-Sort schreiben der halt mit allen möglichen DAtentypen umgehen kann. Man muss der Funktion dazu aber eine Funktion mitgeben die den jeweiligen Datentyp vergleichen kann. Mein Merge-Funktions-Prototyp sieht so aus

C++:
void msort(void* base, long number, long size, int (*cmp) (void*, void*));


Zum Vergleich von ints übergebe ich dieser Funktion folgende Funktion:

C++:
printf("Uebergabe: %d, %d\n", feld1[i1*size], feld2[i2*size]); // Werte noch alle richtig!
if ( (i2 >= g2) || (i1 < g1 && cmp(&feld1[i1*size], &feld2[i2*size]) < 0))
{
    // nehme aus Feld1
    charbase[i*size] = feld1[i1*size];
    i1++;  
}


Und hier rufe ich die Funktion auf:


C++:
// Integers vergleichen
int int_compare(void *vp1, void *vp2)
{
    int* ip1 = vp1;
    int* ip2 = vp2;
    printf("%d - %d\n", ip1[0], ip2[0]); // Werte teilweise falsch
    return(*ip1 - *ip2);
}


Wie in den Kommentaren beschrieben, sind die Int-Werte vor dem übergeben an die Funktion noch in Ordnung, allerdings in der Funktion sind die Werte teilweise falsch.
Also manchmal stimmen beide übergebenen ints in der Funktion, manchmal ist einer falsch (zB aus 3 wird 5321 oder so) und manchmal sind sogar beide ints dann falsch.
Ich kann mir den Fehler nicht erklären und hoffe mir kann einer helfen.

MfG Baweg

Dieser Post wurde am 26.02.2007 um 21:08 Uhr von Baweg editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
27.02.2007, 07:59 Uhr
Kest
saint


Hi!

Würde nett sein, wenn du den ganzen Quellcode zeigen würdest.
--
Wenn man einen Hufschlag hört, sollte man >Pferd< denken und nicht >Zebra<.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
27.02.2007, 11:09 Uhr
stephanw
localhorst


Nebenbei: C oder C++ ? Wenn Du wirklich mit "allen möglichen Datentypen" umgehen können willst, kommst Du um C++-Templates nicht herum. Dann kannst Du Dir auch den ganzen (void*)-Mist sparen.
--
Reden ist Schweigen und Silber ist Gold.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
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.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
27.02.2007, 14:15 Uhr
Blubber2063



Genau da liegt dein Fehler, da muss natürlich ein Zeiger vom passenden Datentyp stehen. Bei int Werten die größer 512 sind, bzw signed 255 gibt das auch Fehler. Da musst du halt doch auf den Typ in den Funktionen achten, vor allem weil die Operatoren für die Datentypen auch andere Algorithmen haben.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
27.02.2007, 14:28 Uhr
Baweg



Das heißt in den Vergleichsfunktionen muss ich int und float nehmen?
So hat ichs vorher mit int, aber dann waren die Werte in der Funktion total falsch!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
27.02.2007, 16:37 Uhr
0xdeadbeef
Gott
(Operator)



C++:
int int_compare(void *p, void *q) {
  return *(int *)p - *(int *)q;
}


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: