Bei Mergesort probleme mit Free(array) (C)

Status
Für weitere Antworten geschlossen.

Samsa

Commander
Registriert
Dez. 2005
Beiträge
2.614
Hi zusammen.

Ich muss für die Uni ein Programm schreiben das die werte von 2^14 bis 2^22 sortiert.
Jedoch krieg ich jedesmal ne Fehlermeldung wenn er das Testarray "löschen" soll.
Nehme ich das weg funktioniert der Code aber das ist nicht wirklich prickelnd.

Evtl. weiß ja einer von euch weiter (fehler liegt bei free(testArray);)

Code:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define CLOCKS_PER_MS 1

void mergesort(int *values, int length);
void bubblesort(int *values, int length);
int isSorted(int *values, int length);

int main() {

    unsigned int i, j, count;

    clock_t start, end;

    int *testArray;
    for (i = 14; i < 23; i++) {

        printf("Sortiere 2^%u Felder\n", i);
        count = pow(2,i);

		testArray = (int *)malloc(sizeof(int)*count);

        for (j = 0; j<count; j++) {
            testArray[j] = rand();
        }
 
        start = clock();
        bubblesort(testArray, count);
        end = clock();
        if (isSorted(testArray, count) == 1) printf("bubble array nicht sortiert\n");
        printf("bubblesort: %li ms\n", (end-start)/CLOCKS_PER_MS);
 
        for (j = 0; j<count; j++) {
            testArray[j] = rand();
        }

        start = clock();
       mergesort(testArray, count);
        end = clock();
        if (isSorted(testArray, count) == 1) printf("merge array nicht sortiert\n");
        printf("mergesort: %li ms\n\n", (end-start)/CLOCKS_PER_MS);
 
        free(testArray);     //Hier liegt der Fehler//
    }
 
    return 0;
}
 
void mergesort(int *values, int length) {
    int
        left = length/2,
        right = length-left,
        i, j;
    int
        * arrLeft = (int *)malloc(sizeof(int)*left),
        * arrRight = (int *)malloc(sizeof(int)*right);
 
    if (length <= 1)
        return;
 
    //fill upper array
    for (i = 0; i < left; i++) {
        arrLeft[i] = values[i];
    }
 
    //fill lower
    for (i = 0, j = right-1; i < right; i++, j++) {
        arrRight[i] = values[j];
    }
 
    mergesort(arrLeft, left);
    mergesort(arrRight, right);
 
    for (i = 0; i < length; i++) {
        if (arrLeft[0] <= arrRight[0]) {
            values[i] = left;
        } else {
            values[i] = right;
        }
    }
 
    free(arrLeft);
    free(arrRight);
}
 
void bubblesort(int *values, int length) {
    int i, temp;
    int test = 1;
 

    while (test) {
        test=0;
        for (i = 0; i < length; i++) {
            if (values[i] > values[i+1]) {
                temp = values[i];
                values[i] = values[i+1];
                values[i+1] = temp;
                test=1;
            }
        }
        if (!test) break;
    }
}
 
int isSorted(int *values, int length) {
    int i;
    for (i = 0; i < length-1; i++) {
        if (values[i] > values[i+1])
            return 1;
    }
    return 0;

}


Ich benutze VS 2003

Genaue Fehlerbeschreibung:

Debug Error!
Program ...| Pfad... merge und bubble.exe

DAMAGE: After normal Block (#46) 0x00520068
Press Retry to debug Application


Wenn ich auf Wiederholen klicke kommt eine weitere Meldung "Unbehandelte Ausnahme in Merge und Bubble.exe: Benutzerhaltepunkt
Danach geht es zwar weiter aber es kommt wieder ein Debug Error.

Evtl. weiß ja einer von euch weiter.
unter Linux mit GCC funktioniert es ohne Probleme.
Gruß, Jan
 
testArray = (int *)malloc(sizeof(int)*count);

Auf NULL testen ggf.?
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben