2017-02-02 6 views
0

Ich habe ein Array von zuvor zugeordneten Strukturen. Ich versuche, eine Funktion zu konstruieren, die dieses Array als Eingabe verwendet, so dass ich ein Array von Zeigern zu vor-zugewiesenen Struktur-Array erstellen kann. Ich möchte dann das Zeiger-Array mit qsort sortieren, aber ich verstehe, wie die Zeiger herumgereicht werden, wenn ich versuche, meinen Code auszuführen, ist es ein Minenfeld von Speicherzugriffsverletzungen.Zuordnen und Sortieren eines Arrays von Zeigern zu vorhandenen Strukturen

Die erste Ausgabe erscheint mit der Linie zu sein: (&(pRet->ppIndexArray))[i] = &pTestElement[i]; in sortedIndexPointer war mein Denken, dass ppIndexArray ein Zeiger auf ein Array von Zeigern ist, und ich brauche die Adresse des Arrays von ppIndexArray darauf zu bekommen und dann schreiben die Adresse des aktuellen TestElements dazu, aber das scheint nicht richtig zu sein.

Bitte beachten Sie meine vereinfachte Code unten:

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

typedef int(*CompareFunction)(const void *, const void *); 

typedef struct TestElement 
{ 
    const char *pName; 
    double data; 
} TestElement; 

typedef struct TestElementIndex 
{ 
    unsigned elementCount; 
    TestElement **ppIndexArray; 
} TestElementIndex; 

int CompareNumbers(const void *p1, const void *p2) { 
    TestElement *pTest1 = *(TestElement **)p1; 
    TestElement *pTest2 = *(TestElement **)p2; 
    if (pTest1->data > pTest2->data) { 
     return 1; 
    } 
    else if (pTest1->data < pTest2->data) { 
     return -1; 
    } 
    else { 
     return 0; 
    } 
} 

TestElementIndex *sortedIndexPointer(TestElement *pTestElement, const unsigned Count, 
            CompareFunction comparer) { 
    TestElementIndex *pRet = malloc(sizeof(TestElementIndex)); 
    pRet->elementCount = Count; 
    pRet->ppIndexArray = malloc(sizeof(TestElement *)*Count); 

    for (unsigned i = 0; i < Count; i++) { 
     (&(pRet->ppIndexArray))[i] = &pTestElement[i]; 
    } 

    if (comparer) { 
     qsort(pRet->ppIndexArray, sizeof(TestElement *), Count, comparer); 
    } 
    return pRet; 
} 

void DisplayElements(const TestElementIndex *pTestElementIndex) { 
    for (unsigned i = 0; i < pTestElementIndex->elementCount; i++) { 
     printf("%lf\n", 
      pTestElementIndex->ppIndexArray[i]->data); 
    } 
} 

int main() { 
    TestElement arr[] = { 
     { "Test1", 5 }, 
     { "Test2", 8 }, 
     { "Test3", 4 }, 
     { "Test4", 9 }, 
     { "Test5", 1 }, 
     { "Test6", 2 }, 
     { "Test7", 0 }, 
     { "Test8", 7 }, 
     { "Test9", 3 }, 
     { "Test10", 6 } 
    }; 
    unsigned Count = sizeof(arr)/sizeof(arr[0]); 
    TestElementIndex *pSorted = sortedIndexPointer(arr, Count, CompareNumbers); 
    DisplayElements(pSorted); 
} 
+0

Als erstes sollten Sie Ihre verschiedenen Zeiger in einem Debugger untersuchen. Ich wette, dass 10 Minuten Debug-Zeit Ihnen genau zeigen, wo Ihre Zeiger schief gehen. Andere werden versuchen, Ihren Code in der Zwischenzeit zu überprüfen, aber Sie sollten in der Lage sein, die Antworten ziemlich schnell selbst zu bekommen. –

Antwort

1

Es gibt einige Probleme mit Ihrem Code: Erstens, qsort Argumente eine andere Reihenfolge haben, Sie

qsort(pRet->ppIndexArray, Count, sizeof(TestElement *), comparer); 

nicht

nennen wollte
qsort(pRet->ppIndexArray, sizeof(TestElement *), Count, comparer); 

Als nächstes, wenn Sie das Indexarray füllen, wollen Sie nicht die Adresse von (Adresse von) Array nehmen Sie möchten das Array selbst,

for (unsigned i = 0; i < Count; i++) { 
    pRet->ppIndexArray[i] = &pTestElement[i]; 
} 

sonst wird es meist sinnvoll ist, überprüfen http://cpp.sh/5mrxh.

+0

Super danke! Ich denke, die qsort-Argumente haben mich im Kreis laufen lassen. –

+1

Lassen Sie mich bitte C++ vorschlagen, da es kein solches Problem hat (der Compiler wird Ihnen sagen, dass Ihre Argumente falsch sind). –

+0

Ich bin mir bewusst, und normalerweise C++ verwenden, aber in diesem Fall das Projekt forderte mich C zu verwenden, mir zu vertrauen, ich wünschte, ich könnte! –

Verwandte Themen