free (): неверный следующий размер (обычный) с qsort () - PullRequest
0 голосов
/ 31 января 2019

При запуске этого кода для набора данных seed размером 210 * 8 я получаю сообщение об ошибке после строки qsort () в функции предикторов.Он не выполняется после qsort ().

Я не уверен, что qsort вызывает эту ошибку или почему она возникает, но любая оценка будет принята.

Я получаю ошибку, когда qsortоператор выполнен.

Мой код:

`include stdio.h
    include stdlib.h
    include string.h
    include math.h

    typedef struct point{
        int class;
        float coords[7], dist;
    }point;

    int argmax(int arr[], int n){
        int marg = -1, mxf = -1, i;
        for (i =0; i<= n; i++){
            if (arr[i] > mxf){
                mxf = arr[i];
                marg = i;
            }
        }
        return marg;
    }

    float get_accuracy(int pred[], int act[], int n){
        float cor = 0;
        int i;
        for (i = 0; i< n; i++){
            if (pred[i] == act[i]) cor +=1;
        }
        return (cor*100.0)/n ;
    }

    float get_avg(float arr[], int n){
        float sum = 0;
        int i;
        for (i = 0; i<n; i++){
            sum +=  arr[i];
        }
        return sum/n;
    }

    point *shuffle(point *dataset, int rows, int features, int groups, int classes)
    {
        int i,j,k,l,m = 0;
        point *shuffled_dataset;
        shuffled_dataset = (point *)malloc(sizeof(point)*rows);
        for(i=0; i<rows/classes; i++,m++)
        {
            for(j=0; j<rows/(groups*classes); j++)
            {
                for(k=0; k<classes; k++,m++)
                {
                    shuffled_dataset[m] = dataset[rows/classes*k + i];
                    /*for(l=0; l<features; l++)
                    {
                        shuffled_dataset[m].coords[l] = dataset[rows/classes*k + i].coords[l];
                    }*/
                }
                i++;
            }
            i--;
        }
        return shuffled_dataset;
    }


    float minkowski_dist(float* x, float* y, int len, int p){
        int i;
        float sum=0;
        for(i=0;i < len; i++){
            sum += pow(fabs(x[i] - y[i]),p);
        }
        return pow(sum,1/p);
    }

    int comparison(const void *a, const void *b) {
        point *ia = (point *)a;
        point *ib = (point *)b;
        return (int)(100.f*ia->dist - 100.f*ib->dist);
    }

    int predict(point test_point, point train[], int n, int k, int p, int classes, int features){
        int i;
        printf("Hi\n");
        for (i = 0; i < n; i++)
        {
            train[i].dist = minkowski_dist(test_point.coords, train[i].coords, features, p);
            printf("%d.\t", i+1);
            print_point(train[i]);
        }
        qsort (train, n-1, sizeof(train[0]), comparison);
        int freq[classes+1];
        for (i = 0; i < classes+1; ++i)
            freq[i] = 0;
        for (i = 0; i < k; i++)  
           freq[train[i].class]++; 
        return argmax(freq,classes);
    }

    float rFoldKNN(point *arr, int num, int r, int k, int p,  int classes, int features){
        int gsize = num/r;
        int i, j, h;
        int pred[gsize], act[gsize];
        point cval[gsize], train[num - gsize];
        float acc[r];
        for(i=0; i<r; i++)
        {
            int cind = 0, tind = 0;
            for(j=0; j<gsize; j++)
            {
                cval[cind++] = arr[gsize*i+j];
                for(k=0; k<r; k++)
                {
                    if(k!=i)
                    {
                        train[tind++] = arr[gsize*k+j];
                    }
                }
            }
            for(j=0; j<gsize; j++)
            {
                printf("%d\t%d\n", tind, cind);
                pred[j] = predict(cval[j], train,  num-gsize, k,  p, classes, features);
                act[j] = cval[j].class;
            }
            acc[i] = get_accuracy(pred, act,  gsize);
        }
        return get_avg(acc,r);
    }

    int main()
    {
        FILE *fp;
        int r = 10, p = 5, k = 10;
        int rows = 210;
        int columns = 8;
        int classes = 3;
        int size = rows * columns; /*Assumed size of the dataset*/
        float *data;          /*Creating an array of assumed size as 1d(split after every 8 values to get the next row)*/
        int count = 0;
        int i, j;
        float accuracies [k][p], maxac = -1.0;;
        int maxk, maxp;
        float c;
        point *all;
        all = (point *)malloc(sizeof(point)*rows);
        data = (float*)malloc(sizeof(float*)*size);
        if ((fp = fopen("seeds_dataset.txt", "r")) == NULL)
        {
            printf("Error reading file!");
            exit(1);
        }
        for(i = 0; i < rows; i++){
            for (j = 0 ; j < columns; j++){
                fscanf(fp,"%f",&c);
                if (j == columns-1)
                    all[i].class = c;
                else
                    all[i].coords[j] = c;
            }
        }
        fclose(fp);
        for(i=0; i<rows; i++)
        {
            printf("%d.\t", i+1);
            print_point(all[i]);
        }
        all = shuffle(all, rows, columns-1, 10, classes);
        printf("Hi\n");
        for(i=0; i<rows; i++)
        {
            printf("%d.\t", i+1);
            print_point(all[i]);
        }
        for (i = 1; i <= k; ++i){
            for (j = 1; j <= p; ++j){
                accuracies[i][j] = rFoldKNN(all, rows, r, i, j, classes, columns-1);
                if (accuracies[i][j] > maxac){
                    maxac = accuracies[i][j];
                    maxk = i;
                    maxp = j;
                }
            }
        }
        printf("best validation accuracy %f  best k %d best p %d ",maxac, maxk, maxp );
        return 0;
    }

`

1 Ответ

0 голосов
/ 31 января 2019

free(): invalid next size - это сообщение об ошибке, которое вы часто получаете, когда вы повредили область памяти, используемую malloc, например, запись за пределами выделенного блока, уничтожение встроенной учетной информации, используемой функциями распределения памяти.

Учитывая нехватку фактического кода в вашем вопросе (или, после вашего обновления, огромный объем кода, который, как вам кажется, не уменьшился до более точноготочно определите проблему), это примерно столько деталей, сколько я могу предоставить.Я предлагаю проверить ваш код на предмет областей, в которых вы не используете должным образом выделенную память.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...