2016-06-20 6 views
-1

Mein Problem: Ich möchte eine Funktion erstellen, die zwei beliebige Elemente im Array von generischen Typ tauschen kann.C - generische Funktion: Tausche zwei Elemente im Array

Ich habe SwapG Funktion, die zwei Gegenstände aller Art austauschen können:

void SwapG(void * a, void * b, size_t size) 
{ 
    void * temp = malloc(size); 
    memcpy(temp, a, size); 
    memcpy(a, b, size); 
    memcpy(b, temp, size); 
} 

Hier ist mein Versuch der Funktion, die zwei Elemente in einem Array von jeder Art tauschen würde:

void SwapInArrayG(void ** arr, int a, int b, size_t size) 
{ 
    void * temp = malloc(size); 
    memcpy(temp, *(arr + a), size); 
    memcpy(*(arr + a), *(arr + b), size); 
    memcpy(*(arr + b), temp, size); 
} 

I bin mir ziemlich sicher, dass ich die Hinweise vermasselt habe, aber ich kann keine Lösung finden. Ich würde jede Hilfe schätzen :).

+2

Hinweis: nachdem die Kopie fertig ist, gut zu 'frei (temp);' – chux

+0

Was ist das Problem mit einem einfachen Makro? Ihr Code ist eine Einladung zu Programmierfehlern und wird sehr langsam Speicher für jeden Swap zuweisen/freigeben – Olaf

+1

Wenn Sie zwei Einträge im selben Array tauschen möchten, warum verwenden Sie nicht die erste Funktion? 'SwapG (& array [idx1], & array [idx2], sizeof (entry))' – EOF

Antwort

1

Hinzufügen zu einer void * ist nicht definiert. Cast to char *.

Möglicherweise müssen Sie arr de-referenzieren müssen, aber ich denke, OP's Signatur sollte stattdessen angepasst werden. Siehe @user3386109

Maßstab den Zeiger Berechnung @EOF

frei, die zugewiesenen Speicher.


Ich würde erwarten, eine void * zu übergeben, ausreichend zu sein.

void SwapInArrayG(void * arr, int a, int b, size_t size) { 
    void * temp = malloc(size); 
    if (size > 0) { 
     assert(temp); 
     assert(a >= 0 && b >= 0); 
     memcpy(temp, (char *)arr + size*a, size); 
     memcpy((char *)arr + size*a, (char *)arr + size*b, size); 
     memcpy((char *)arr + size*b, temp, size); 
    } 
    free(temp); 
} 

Unklar wie OP diese Funktion aufruft, aber das Folgende ist typisch.

foo_type G[some_size]; 
SwapInArrayG(G, index_a, index_b, sizeof *G); 

Hinweis: Je Ziele auf Codierung, mit Indizes vom Typ size_t in der Regel über Typen bevorzugt wird int.

Anmerkung: Die assert(temp); innerhalb if (size > 0) als Zuteilen 0 Byte ist zurückkehren NULL und nicht sein, out-of-Speicher. OTOH, size == 0 ist sehr ungewöhnlich.

+0

@chox Vielen Dank, tut mir leid, wenn diese Frage dumm war, ich lerne gerade C –