18
Дек
2015

Сортировка слиянием (merge sort): проблема с динамической аллокацией, си

Задача: реализовать сортировку слиянием (рекурсия).

Тест 1 выдаёт, что код компилируется с С99 без предупреждений и отвечает формальным критериям.

А тест 2 выдаёт ошибку динамической аллокации:

2015-12-17T22:44:11.883304922Z [ INFO] TEST 2: Check Calls: Recursion and dynamic memory 2015-12-17T22:44:11.889112824Z [ INFO] ----------------------------------------------------------------------- [INFO] Check: Recursion [INFO] Check: (c|m)allocs [ERROR] No malloc or calloc found! [INFO] TERMINATION TIME: > Thu Dec 17 23:44:11 CET 2015 2015-12-17T22:44:11.955008007Z
[INFO] > RESULT: FAILED

Надеюсь, вопрос оформляю верно.

   int main (int argc, char *argv[]){ 
       if (argc!=3){
            printf ("usage: %s <maximale anzahl>  <dateipfad>\n", argv[0]);
            exit(2);
        }

        char *filename = argv[2];

        int* array = malloc(sizeof(int) * argc); 
/* С int* array = (int*)malloc(sizeof(int)*atoi(argv[1])); та же ошибка */

        int len = read_array_from_file(array, atoi(argv[1]), filename);

        printf("Eingabe:\n");
        print_array(array, len);

        merge_sort(array, 0, len);

        printf("Sortiert:\n");
        print_array(array, len);

        free(array);

        return 0;
    }



    void merge(int* array, int start, int middle, int end){    
            int *arrayB = (int*)malloc(sizeof(int)); 
/* та же ошибка с int *arrayB = (int *)malloc(sizeof(end-start+1)); или int *arrayB = (int*)malloc(sizeof(int)); */

            int k = start;                               
            int m = middle +1;                      
            int i = 1;                                      

            while(k<=middle && m <=end){
                if(array[k]<=array[m]){            
                    arrayB[i] = array[k];
                    k++;
                }
                else{
                    arrayB[i] = array[m];
                    m++;
                }
                i++;
            }
            while(k<=middle){
                arrayB[i] = array[m];
                k++;
                i++;
            }
            while(m<= end){
                arrayB[i] = array[m];
                m++;
                i++;
            }
            int j = 1;
            while(j<i){
                array[start+j-1] = arrayB[j];
                j++;
            }
            free(arrayB);
    }

     void merge_sort(int* array, int first, int last){
        int middle = (last + first)/2; 
        if (first < last){
          merge_sort(array, first, middle ); 
          merge_sort(array, middle+1, last);
          merge(array, first, middle, last);
        }
        return; 
    }

Источник: https://ru.stackoverflow.com/questions/475696/%D0%A1%D0%BE%D1%80%D1%82%D0%B8%D1%80%D0%BE%D0%B2%D0%BA%D0%B0-%D1%81%D0%BB%D0%B8%D1%8F%D0%BD%D0%B8%D0%B5%D0%BC-merge-sort-%D0%BF%D1%80%D0%BE%D0%B1%D0%BB%D0%B5%D0%BC%D0%B0-%D1%81-%D0%B4%D0%B8%D0%BD%D0%B0%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B9-%D0%B0%D0%BB%D0%BB%D0%BE%D0%BA%D0%B0%D1%86%D0%B8%D0%B5%D0%B9-%D1%81%D0%B8

Тебе может это понравится...

Добавить комментарий